本人開發的一個app使用了sharesdk集成微信登錄功能,在測試的過程中微信授權登錄界面有調用,但是授權后原應用的回調沒有被執行
應用的包名是com.kimi.searcher
首先,確認微信點擊授權后有沒有執行回調,方法是通過日志過濾activitymanager,
日志中有出現
04-16 13:27:43.345 1805-3279/? I/ActivityManager: START u0 {flg=0x18000000 cmp=com.kimi.searcher/.wxapi.WXEntryActivity (has extras)} from uid 10156 on display 0
說明微信有回調app的wxentryactivity
那么繼續判斷安裝包中的WXEntryActivity是否存在
使用https://github.com/iBotPeaches/Apktool 來反編譯apk安裝包,發現安裝包中不存在com.kimi.searcher.wxapi.WXEntryActivity.取而代之的是com.qq.rnsharesdk.wxapi.WXEntryActivity.
原因分析:com.qq.rnsharesdk.wxapi.WXEntryActivity是放在一個依賴項目中的微信入口activity.被依賴的項目的package是com.qq.rnsharesdk。 activity的名稱是.wxapi.WXEntryActivity。 原來gradle 在編程的過程中,androidmanifest.xml中的相對路徑組件會根據被依賴包中的package名來生成全路徑名稱,而不是app項目中的package來生成全路徑名稱。
於是我在app項目中添加一條activity, 並且把build.gradle中的applicationId改成了com.kimi.searcher。編譯后發現回調依然沒有被執行,把新包進行反編譯,發現androidmanifest.xml中多了一條com.awesomeproject.wxapi.WXEntryActivity。
原因是androidmanfiest.xml的相對路徑填充不會使用build.gradle中使用的applicationId,而會使用androidmanifest.xml中的package來進行路徑填充。
與往常使用gradlew編譯安卓項目,build.gradlew的配置會覆蓋androidmanifest.xml的配置的經驗不同,androidmanifest.xml的相對路徑填充的規則:
1.使用最近的package配置,2.不使用build.gradle中的配置
Android 微信授權登錄、獲取Wx用戶信息,解決無法回調問題
微信授權登錄,官方說的不是很清楚、所以導致有一部分的坑。
據此記載..(坑)
1.微信注冊應用平台的應用簽名為 打包keystore的MD5 小寫並且去掉 ":" 號組成、或者去下載 微信簽名生成工具 輸入項目的packageName也可以查看到。
2.授權沒反應,監測微信App_Id是否正確、是否按照上1.生成。 當前的App是否正式簽名?也就是正式App.. DeBug簽名環境的App貌似無法調動微信。
3.關於回調:是否按照官方要求注冊WXEntryActivity並且繼承Acticiy、 此Activity不能改名,並且在你的 package(項目報名).wxapi.WXEntryActivity.java 下面。 注冊* 每段代碼都別少...
<!--注冊微信回調 WXEntryActivity --> <activity android:name=".wxapi.WXEntryActivity" android:exported="true" android:label="@string/app_name" android:launchMode="singleTop" android:theme="@android:style/Theme.Translucent" />
4.回調方法onResp() 方法沒有觸發回調、請監測WXEntryActivity onCreate中是否調用此方法 mApi.handleIntent(this.getIntent(), this);
public class WXEntryActivity extends Activity implements IWXAPIEventHandler { private final String TAG = this.getClass().getSimpleName(); public static final String APP_ID = "請自己填寫"; public static final String APP_SECRET = "請自己填寫"; private IWXAPI mApi; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mApi = WXAPIFactory.createWXAPI(this, APP_ID, true); mApi.handleIntent(this.getIntent(), this); } //微信發送的請求將回調到onReq方法 @Override public void onReq(BaseReq baseReq) { } //發送到微信請求的響應結果 @Override public void onResp(BaseResp resp) { switch (resp.errCode) { case BaseResp.ErrCode.ERR_OK: //發送成功 break; case BaseResp.ErrCode.ERR_USER_CANCEL: //發送取消 break; case BaseResp.ErrCode.ERR_AUTH_DENIED: //發送被拒絕 break; default: //發送返回 break; } finish(); } }
5.當授權時候進入WXEntryActivity、當前背景可能是黒或白,為了不影響用戶體驗,可以把當前Activity設置為透明。android:theme="@android:style/Theme.Translucent" ,可以參照上3. WXEntryActivity注冊格式。
以上便是授權登錄遇到的坑、只怪Wx要求格式的有個性、多多少少會遇到這樣的坑。
授權登錄並且拿取Wx用戶信息,簡單三部曲:
* * 1.sendReq(req). 用戶授權可以拿到 code * * 2.用code.調用Wx接口拿到 openid & accessToken * * 3.通過openid & accessToken 倆參數可以拿到最終用戶信息 * *
具體可參考:微信授權登錄取用戶信息步驟
部分代碼:
/** * 獲取openid accessToken值用於后期操作 * * @param code 請求碼 */ private void getAccess_token(final String code) { new Thread(new Runnable() { @Override public void run() { String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APP_ID + "&secret=" + APP_SECRET + "&code=" + code + "&grant_type=authorization_code"; try { JSONObject jsonObject = JsonUtils.initSSLWithHttpClinet(path);// 請求https連接並得到json結果 if (null != jsonObject) { String openid = jsonObject.getString("openid").toString().trim(); String access_token = jsonObject.getString("access_token").toString().trim(); getUserMesg(access_token, openid); } } catch (Exception e) { e.printStackTrace(); } } }).start(); } /** * 獲取微信的個人信息 * * @param access_token * @param openid */ private void getUserMesg(final String access_token, final String openid) { String path = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid; try { JSONObject jsonObject = JsonUtils.initSSLWithHttpClinet(path);// 請求https連接並得到json結果 if (null != jsonObject) { String nickname = jsonObject.getString("nickname"); int sex = Integer.parseInt(jsonObject.get("sex").toString()); String headimgurl = jsonObject.getString("headimgurl"); Log.e(TAG, "getUserMesg 拿到了用戶Wx基本信息.. nickname:" + nickname); } } catch (Exception e) { e.printStackTrace(); } return; }
參考、感謝:
1.http://blog.csdn.net/xiong_it/article/details/48317527