diff --git a/app/build.gradle b/app/build.gradle index 991d51234d..34adee8b24 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,8 +47,7 @@ android { ndk { // 如果不添加 `arm64` 调用系统的 PackageManager 的方法读取安装包信息的时候会出现 native 层闪退,草 - // 微博 SDK 没有 64位的 SO,添加了 arm64 又会无法使用微博登录,下个版本更新微博 SDK 刻不容缓了! - abiFilters "armeabi-v7a", "x86" + abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86" } renderscriptTargetApi 18 @@ -344,6 +343,8 @@ dependencies { implementation "com.aliyun.openservices:aliyun-log-android-sdk:${aliyunLog}" implementation "com.github.princekin-f:EasyFloat:${easyFloat}" + implementation 'io.github.sinaweibosdk:core:11.6.0@aar' + implementation project(':libraries:LGLibrary') // implementation project(':libraries:MTA') implementation project(':libraries:QQShare') diff --git a/app/libs/sina-weibo-2.0.3.aar b/app/libs/sina-weibo-2.0.3.aar deleted file mode 100644 index 3b5d737637..0000000000 Binary files a/app/libs/sina-weibo-2.0.3.aar and /dev/null differ diff --git a/app/src/main/java/com/gh/common/util/AccessTokenKeeper.java b/app/src/main/java/com/gh/common/util/AccessTokenKeeper.java index 5a81cfbebf..e296f72462 100644 --- a/app/src/main/java/com/gh/common/util/AccessTokenKeeper.java +++ b/app/src/main/java/com/gh/common/util/AccessTokenKeeper.java @@ -2,6 +2,7 @@ package com.gh.common.util; import android.content.Context; import android.content.SharedPreferences; +import android.os.Bundle; import com.sina.weibo.sdk.auth.Oauth2AccessToken; @@ -13,6 +14,7 @@ public class AccessTokenKeeper { private static final String PREFERENCES_NAME = "com_weibo_sdk_android"; private static final String KEY_UID = "uid"; + private static final String KEY_USERNAME = "userName"; private static final String KEY_ACCESS_TOKEN = "access_token"; private static final String KEY_EXPIRES_IN = "expires_in"; private static final String KEY_REFRESH_TOKEN = "refresh_token"; @@ -28,13 +30,14 @@ public class AccessTokenKeeper { return; } - SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND); + SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = pref.edit(); editor.putString(KEY_UID, token.getUid()); - editor.putString(KEY_ACCESS_TOKEN, token.getToken()); + editor.putString(KEY_USERNAME, token.getScreenName()); + editor.putString(KEY_ACCESS_TOKEN, token.getAccessToken()); editor.putString(KEY_REFRESH_TOKEN, token.getRefreshToken()); editor.putLong(KEY_EXPIRES_IN, token.getExpiresTime()); - editor.commit(); + editor.apply(); } /** @@ -48,14 +51,14 @@ public class AccessTokenKeeper { return null; } - Oauth2AccessToken token = new Oauth2AccessToken(); - SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND); - token.setUid(pref.getString(KEY_UID, "")); - token.setToken(pref.getString(KEY_ACCESS_TOKEN, "")); - token.setRefreshToken(pref.getString(KEY_REFRESH_TOKEN, "")); - token.setExpiresTime(pref.getLong(KEY_EXPIRES_IN, 0)); - - return token; + SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE); + Bundle args = new Bundle(); + args.putString(KEY_UID, pref.getString(KEY_UID, "")); + args.putString(KEY_USERNAME, pref.getString(KEY_USERNAME, "")); + args.putString(KEY_ACCESS_TOKEN, pref.getString(KEY_ACCESS_TOKEN, "")); + args.putString(KEY_REFRESH_TOKEN, pref.getString(KEY_REFRESH_TOKEN, "")); + args.putLong(KEY_EXPIRES_IN, pref.getLong(KEY_EXPIRES_IN, 0)); + return Oauth2AccessToken.parseAccessToken(args); } /** @@ -68,9 +71,9 @@ public class AccessTokenKeeper { return; } - SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND); + SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = pref.edit(); editor.clear(); - editor.commit(); + editor.apply(); } } diff --git a/app/src/main/java/com/gh/common/util/LoginHelper.kt b/app/src/main/java/com/gh/common/util/LoginHelper.kt index 69cd9e5dd8..a189bf3aed 100644 --- a/app/src/main/java/com/gh/common/util/LoginHelper.kt +++ b/app/src/main/java/com/gh/common/util/LoginHelper.kt @@ -8,12 +8,11 @@ import com.gh.gamecenter.user.LoginTag import com.halo.assistant.HaloApp import com.lightgame.utils.RuntimeUtils import com.lightgame.utils.Utils -import com.sina.weibo.sdk.WbSdk import com.sina.weibo.sdk.auth.AuthInfo import com.sina.weibo.sdk.auth.Oauth2AccessToken import com.sina.weibo.sdk.auth.WbAuthListener -import com.sina.weibo.sdk.auth.WbConnectErrorMessage -import com.sina.weibo.sdk.auth.sso.SsoHandler +import com.sina.weibo.sdk.openapi.IWBAPI +import com.sina.weibo.sdk.openapi.WBAPIFactory import com.tencent.mm.opensdk.modelmsg.SendAuth import com.tencent.mm.opensdk.openapi.IWXAPI import com.tencent.mm.opensdk.openapi.WXAPIFactory @@ -24,6 +23,7 @@ import org.json.JSONException import org.json.JSONObject import java.lang.ref.WeakReference + /** * 第三方登录辅助类 */ @@ -36,7 +36,7 @@ object LoginHelper { private var mTencent: Tencent // QQ private var mIWXAPI: IWXAPI // 微信 - private var mSsoHandler: WeakReference? = null // 微博 + private lateinit var mWBAPI: IWBAPI // 微博 private var mQqLoginListener: IUiListener @@ -56,11 +56,17 @@ object LoginHelper { Utils.log("QQLoginComplete::$s") try { mTencent.openId = o.getString("openid") - mTencent.setAccessToken(o.getString("access_token"), o.getString("expires_in")) + mTencent.setAccessToken( + o.getString("access_token"), + o.getString("expires_in") + ) val content = JSONObject() content.put("openid", o.getString("openid")) - content.put("access_token_expire", Utils.getTime(context) + o.getLong("expires_in")) + content.put( + "access_token_expire", + Utils.getTime(context) + o.getLong("expires_in") + ) content.put("access_token", o.getString("access_token")) mLoginCallback?.get()?.onLoginSuccess(LoginTag.qq, content) // 回调QQ登录成功 @@ -87,7 +93,6 @@ object LoginHelper { } - // DouYinOpenApiFactory.init(DouYinOpenConfig(Config.DOUYIN_CLIENTKEY)) Utils.log("LoginHelper initialization") @@ -120,7 +125,7 @@ object LoginHelper { @JvmStatic fun onWeiboLoginCallback(requestCode: Int, resultCode: Int, data: Intent?) { - mSsoHandler?.get()?.authorizeCallBack(requestCode, resultCode, data) + mWBAPI.authorizeCallback(requestCode, resultCode, data) } // QQ登录 @@ -160,12 +165,14 @@ object LoginHelper { // 微博登录 @JvmStatic fun loginWithWeibo(loginCallback: LoginCallback, context: Activity) { - WbSdk.install(context, AuthInfo(context, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE)) - + mWBAPI = WBAPIFactory.createWBAPI(context) //初始化微博分享 mLoginCallback = WeakReference(loginCallback) - mSsoHandler = WeakReference(SsoHandler(context)) - mSsoHandler?.get()?.authorizeClientSso(object : WbAuthListener { - override fun onSuccess(token: Oauth2AccessToken?) { + mWBAPI.registerApp( + context, + AuthInfo(context, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE) + ) + mWBAPI.authorizeClient(object : WbAuthListener { + override fun onComplete(token: Oauth2AccessToken?) { token?.let { RuntimeUtils.getInstance().runOnUiThread { mAccessToken = token @@ -179,8 +186,12 @@ object LoginHelper { val content = JSONObject() tryWithDefaultCatch { content.put("uid", token.uid) - content.put("access_token", token.token) - content.put("access_token_expire", Utils.getTime(context) + token.expiresTime) + content.put("userName", token.screenName) + content.put("access_token", token.accessToken) + content.put( + "access_token_expire", + Utils.getTime(context) + token.expiresTime + ) content.put("refresh_token", token.refreshToken) // content.put("refresh_token_expire", Utils.getTime(mContext) + 86400 * 30); // refresh_token 有效期30天 mLoginCallback?.get()?.onLoginSuccess(LoginTag.weibo, content)// 微博 登录回调 @@ -188,14 +199,16 @@ object LoginHelper { } } - override fun onFailure(p0: WbConnectErrorMessage?) { + override fun onError(error: com.sina.weibo.sdk.common.UiError?) { mLoginCallback?.get()?.onLoginFailure(LoginTag.weibo, "微博登录需要客户端支持,请先安装微博") } - override fun cancel() { + override fun onCancel() { mLoginCallback?.get()?.onLoginFailure(LoginTag.weibo, "取消授权") } + }) + // 第一次启动本应用,AccessToken 不可用 mAccessToken = AccessTokenKeeper.readAccessToken(context) } diff --git a/app/src/main/java/com/gh/common/util/MessageShareUtils.java b/app/src/main/java/com/gh/common/util/MessageShareUtils.java index 62722a16d1..26e52e1ea8 100644 --- a/app/src/main/java/com/gh/common/util/MessageShareUtils.java +++ b/app/src/main/java/com/gh/common/util/MessageShareUtils.java @@ -11,11 +11,6 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; - -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.util.Base64; import android.view.Gravity; import android.view.KeyEvent; @@ -27,13 +22,15 @@ import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.gh.common.Base64ImageHolder; import com.gh.common.constant.Config; import com.gh.gamecenter.R; import com.gh.gamecenter.WeiBoShareActivity; import com.lightgame.utils.Utils; -import com.sina.weibo.sdk.WbSdk; -import com.sina.weibo.sdk.auth.AuthInfo; import com.tencent.connect.auth.QQToken; import com.tencent.connect.share.QQShare; import com.tencent.mm.opensdk.modelmsg.SendMessageToWX; @@ -53,8 +50,6 @@ import java.io.IOException; import java.lang.ref.WeakReference; import java.util.Date; -import static com.gh.common.util.LoginHelper.WEIBO_SCOPE; - /** * Created by khy on 2016/11/8. */ @@ -284,23 +279,23 @@ public class MessageShareUtils { // 分享 switch (type) { - case "qq" : + case "qq": shareWay = ShareWay.qq; qqShare(); break; - case "qq_zone" : + case "qq_zone": shareWay = ShareWay.qqZone; qZoneShare(); break; - case "wechat" : + case "wechat": shareWay = ShareWay.wechat; wechatShare(); break; - case "wechat_moments" : + case "wechat_moments": shareWay = ShareWay.wechatMoments; wechatMomentsShare(); break; - case "save" : + case "save": String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/ghzhushou/"; writeBitmap(savePath, "gh-" + new Date().getTime() + ".jpg", shareBm, true); break; @@ -414,8 +409,6 @@ public class MessageShareUtils { //新浪微博分享 public void weiboShare() { - WbSdk.install(mContext, new AuthInfo(mContext, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE)); - Activity activity = mActivity.get(); if (activity != null) { Intent intent = WeiBoShareActivity.getWeiboImageShareIntent(activity); diff --git a/app/src/main/java/com/gh/common/util/ShareUtils.java b/app/src/main/java/com/gh/common/util/ShareUtils.java index 667eb403e4..bd04db1eeb 100644 --- a/app/src/main/java/com/gh/common/util/ShareUtils.java +++ b/app/src/main/java/com/gh/common/util/ShareUtils.java @@ -31,8 +31,6 @@ import com.gh.gamecenter.WeiBoShareActivity; import com.gh.gamecenter.entity.ShareEntity; import com.gh.gamecenter.eventbus.EBShare; import com.lightgame.utils.Utils; -import com.sina.weibo.sdk.WbSdk; -import com.sina.weibo.sdk.auth.AuthInfo; import com.tencent.connect.share.QQShare; import com.tencent.connect.share.QzoneShare; import com.tencent.mm.opensdk.modelmsg.SendMessageToWX; @@ -51,8 +49,6 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; -import static com.gh.common.util.LoginHelper.WEIBO_SCOPE; - /** * Created by khy on 2016/9/4. */ @@ -175,7 +171,6 @@ public class ShareUtils { mContext = context.getApplicationContext(); mTencent = Tencent.createInstance(Config.TENCENT_APPID, mContext); //初始化QQ分享 mIWXAPI = WXAPIFactory.createWXAPI(mContext, Config.WECHAT_APPID); //初始化微信分享 - } public static ShareUtils getInstance(Context context) { @@ -215,23 +210,23 @@ public class ShareUtils { // 分享 switch (way) { - case "qq" : + case "qq": mShareType = ShareType.qq; qqShare(); break; - case "qq_zone" : + case "qq_zone": mShareType = ShareType.qqZone; qZoneShare(); break; - case "wechat" : + case "wechat": mShareType = ShareType.wechat; wechatShare(); break; - case "wechat_moments" : + case "wechat_moments": mShareType = ShareType.wechatMoments; wechatMomentsShare(); break; - case "weibo" : + case "weibo": mShareType = ShareType.weibo; sinaWeiboShare(); break; @@ -665,8 +660,6 @@ public class ShareUtils { shareType = "sina_weibo"; LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); - WbSdk.install(mContext, new AuthInfo(mContext, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE)); - if (mShareEntrance == ShareEntrance.qaDetail) { mTitle = "向你推荐:" + mTitle + " @光环助手 " + shareUrl; mSummary = ""; diff --git a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java index 30e3af9026..94c171d1ab 100644 --- a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java +++ b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java @@ -13,6 +13,7 @@ import android.util.Base64; import androidx.annotation.NonNull; import com.gh.common.Base64ImageHolder; +import com.gh.common.constant.Config; import com.gh.common.util.BiCallback; import com.gh.common.util.EnergyTaskHelper; import com.gh.common.util.ImageUtils; @@ -25,13 +26,17 @@ import com.sina.weibo.sdk.api.ImageObject; import com.sina.weibo.sdk.api.TextObject; import com.sina.weibo.sdk.api.WebpageObject; import com.sina.weibo.sdk.api.WeiboMultiMessage; +import com.sina.weibo.sdk.auth.AuthInfo; +import com.sina.weibo.sdk.common.UiError; +import com.sina.weibo.sdk.openapi.IWBAPI; +import com.sina.weibo.sdk.openapi.WBAPIFactory; import com.sina.weibo.sdk.share.WbShareCallback; -import com.sina.weibo.sdk.share.WbShareHandler; -import com.sina.weibo.sdk.utils.Utility; import org.greenrobot.eventbus.EventBus; import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.UUID; /** * Created by khy on 2016/11/23. @@ -48,6 +53,11 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { private static final String KET_TYPE = "KET_TYPE"; private static final String KET_SUMMARY = "KET_SUMMARY"; + private static final String WEIBO_SCOPE = ( + "email,direct_messages_read,direct_messages_write," + + "friendships_groups_read,friendships_groups_write,statuses_to_me_read," + + "follow_app_official_microblog," + "invitation_write"); + private String shareUrl; private String mShareStyle; @@ -55,7 +65,7 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { private String mSummary; private String mShareType; - private WbShareHandler mWeiboShareAPI; + private IWBAPI mWBAPI; @NonNull public static Intent getWeiboShareIntent(Context context, String shareUrl, String shareIcon, @@ -103,14 +113,14 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { Utils.toast(this, R.string.share_skip); - mWeiboShareAPI = new WbShareHandler(this); - mWeiboShareAPI.registerApp(); + mWBAPI = WBAPIFactory.createWBAPI(this); + mWBAPI.registerApp(this, new AuthInfo(this, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE)); if ("NORMAL".equals(mShareStyle)) { if (shareIcon != null) { loadIconAndShare(shareIcon); } else { - onWbShareFail(); + onError(new UiError(0, "", "")); } } else if ("IMAGE".equals(mShareStyle)) { shareImage(); @@ -120,7 +130,7 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { protected void onNewIntent(Intent intent) { super.onNewIntent(intent); - mWeiboShareAPI.doResultIntent(intent, this); //当前应用唤起微博分享后,返回当前应用 + mWBAPI.doResultIntent(intent, this); //当前应用唤起微博分享后,返回当前应用 } private void loadIconAndShare(String iconUrl) { @@ -158,22 +168,37 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { } ImageObject imageObject = new ImageObject(); - imageObject.setImageObject(bgBitmap);//设置缩略图。 注意:最终压缩过的缩略图大小不得超过 32kb。 + imageObject.setImageData(bgBitmap);//设置缩略图。 注意:最终压缩过的缩略图大小不得超过 32kb。 WebpageObject webObject = new WebpageObject(); - webObject.identify = Utility.generateGUID(); + webObject.identify = UUID.randomUUID().toString(); webObject.title = ""; webObject.description = getString(R.string.app_name); webObject.defaultText = getString(R.string.app_name); webObject.actionUrl = shareUrl; - webObject.setThumbImage(bgBitmap); + ByteArrayOutputStream os = null; + try { + os = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 85, os); + webObject.thumbData = os.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (os != null) { + os.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } WeiboMultiMessage weiboMessage = new WeiboMultiMessage();//初始化微博的分享消息 weiboMessage.textObject = textObject; weiboMessage.imageObject = imageObject; weiboMessage.mediaObject = webObject; - mWeiboShareAPI.shareMessage(weiboMessage, false); + mWBAPI.shareMessage(weiboMessage, false); } @Override @@ -189,14 +214,14 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { // 转完后重新置位 Base64ImageHolder.INSTANCE.setImage(""); - Bitmap compressBitmap = compressBitmap(bitmap) ; + Bitmap compressBitmap = compressBitmap(bitmap); ImageObject imageObject = new ImageObject(); - imageObject.setImageObject(compressBitmap); + imageObject.setImageData(compressBitmap); WeiboMultiMessage weiboMessage = new WeiboMultiMessage();//初始化微博的分享消息 weiboMessage.imageObject = imageObject; - mWeiboShareAPI.shareMessage(weiboMessage, false); + mWBAPI.shareMessage(weiboMessage, false); } public Bitmap compressBitmap(Bitmap bitmap) { @@ -223,7 +248,7 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { } @Override - public void onWbShareSuccess() { + public void onComplete() { Utils.toast(this, R.string.share_success_hint); if ("NORMAL".equals(mShareStyle)) { LogUtils.uploadShareResult(ShareUtils.shareType, ShareUtils.shareEntrance.getName(), "success", @@ -240,22 +265,7 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { } @Override - public void onWbShareCancel() { - Utils.toast(this, R.string.share_cancel_hint); - if ("NORMAL".equals(mShareStyle)) { - LogUtils.uploadShareResult(ShareUtils.shareType, ShareUtils.shareEntrance.getName(), "cancel", - ShareUtils.shareEntity.getShareUrl(), ShareUtils.shareEntity.getShareTitle(), ShareUtils.shareEntity.getSummary(), ShareUtils.resourceId); - if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.inviteFriends) { - IntegralLogHelper.INSTANCE.logInviteResult("取消", "微博"); - } - } else { - IntegralLogHelper.INSTANCE.logInviteResult("取消", "微博"); - } - finish(); - } - - @Override - public void onWbShareFail() { + public void onError(UiError uiError) { Utils.toast(this, R.string.share_fail_hint); if ("NORMAL".equals(mShareStyle)) { LogUtils.uploadShareResult(ShareUtils.shareType, ShareUtils.shareEntrance.getName(), "fail", @@ -268,4 +278,19 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { } finish(); } + + @Override + public void onCancel() { + Utils.toast(this, R.string.share_cancel_hint); + if ("NORMAL".equals(mShareStyle)) { + LogUtils.uploadShareResult(ShareUtils.shareType, ShareUtils.shareEntrance.getName(), "cancel", + ShareUtils.shareEntity.getShareUrl(), ShareUtils.shareEntity.getShareTitle(), ShareUtils.shareEntity.getSummary(), ShareUtils.resourceId); + if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.inviteFriends) { + IntegralLogHelper.INSTANCE.logInviteResult("取消", "微博"); + } + } else { + IntegralLogHelper.INSTANCE.logInviteResult("取消", "微博"); + } + finish(); + } } diff --git a/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java index f619a39187..aa3d47f942 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java @@ -302,7 +302,8 @@ LoginFragment extends NormalFragment implements LoginUtils.onCaptchaCallBackList DialogUtils.showQuickLoginPermissionDialog( requireContext(), () -> PermissionHelper.checkReadPhoneStatePermissionBeforeAction(requireContext(), this::startQuickLogin), - () -> {} + () -> { + } ); } } @@ -337,7 +338,7 @@ LoginFragment extends NormalFragment implements LoginUtils.onCaptchaCallBackList toast("手机号码不能为空"); return; } else if (!isAgreePolicy()) { - return; + return; } else if (TextUtils.isEmpty(code)) { toast("验证码不能为空"); return;