本人開發的一個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
