android使用友盟實現第三方登入、分享以及微信回撥無反應問題解決辦法
這裡介紹微信和新浪登入。微信登入和新浪登入都需要申請第三方賬號。可以參考官方文件http://dev.umeng.com/social/android/operation#2還是很清晰的。
新浪微博開放平臺http://open.weibo.com/有賬號就可以,經常刷微博的小夥伴可以直接登入嘍,注意修改安全域名同時確保授權回撥頁與程式碼中配置一致。
登入微信開放平臺https://open.weixin.qq.com/官網, 稽核通過後獲取到微信AppID及AppSecret(注意儲存好,平臺不會再顯示忘了需要重置),需要微信登入功能,需要申請微信登入許可權
下面說程式碼實現
到友盟官網http://www.umeng.com/下載需要的SDK包。copy其中的jar包等到自己的專案中。
1、添加回調Activity
包名目錄下建立wxapi資料夾,新建一個名為WXEntryActivity的activity繼承WXCallbackActivity。這裡注意一定是包名路徑下。同理新浪微博也需要一個回撥的Activity,與微信不同的是它只需要在包名目錄下建立一個名為WBShareActivity類即可,不用建立資料夾,該類繼承WBShareCallBackActivity
2、許可權及其他maifest中的配置
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE" />
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permissionandroid:name="android.permission.INTERNET" />
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permissionandroid:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
相關Activity註冊
新浪微博:(精簡版不需要)以下方式註冊若無法find請把包名寫全。
<activityandroid:name=".WBShareActivity"android:configChanges="keyboardHidden|orientation"android:screenOrientation="portrait" >
<intent-filter>
<actionandroid:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
<categoryandroid:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activityandroid:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"android:configChanges="keyboardHidden|orientation"android:windowSoftInputMode="adjustResize"android:exported="false" >
</activity>
<serviceandroid:name="com.sina.weibo.sdk.net.DownloadService"android:exported="false"></service>
微信:
<activityandroid:name=".wxapi.WXEntryActivity"android:configChanges="keyboardHidden|orientation|screenSize"android:exported="true"android:screenOrientation="portrait"android:theme="@android:style/Theme.Translucent.NoTitleBar" />
分享編輯頁(只有新浪微博精簡版,豆瓣人人騰訊微博需要):
<activityandroid:name="com.umeng.socialize.editorpage.ShareActivity"android:theme="@style/Theme.UMDefault"android:excludeFromRecents="true"/>
友盟Appkey及相關第三方key配置
在AndroidManifest.xml中設定友盟Appkey
<meta-dataandroid:name="UMENG_APPKEY"android:value="561cae6ae0f55abd990035bf">
</meta-data>
3、在專案的application類中配置第三方資訊
{ // <!-- 微信平臺 --> appid appsecretPlatformConfig.setWeixin("替換成自己appid","替換成自己的appsecret"); // <!-- 新浪微博 --> appkey appsecretPlatformConfig.setSinaWeibo("替換成自己appid","替換成自己的appsecret");Config.REDIRECT_URL = "新浪後臺配置的回撥地址"; // <!-- QQ、Qzone -->appid appkey PlatformConfig.setQQZone("替換成自己appid","替換成自己的appsecret");}
在application的oncreat方法中初始化
UMShareAPI.get(this);
4、登入實現
private UMShareAPI mShareAPI = null; private SHARE_MEDIA platform = null;
mShareAPI = UMShareAPI.get(this);點選事件:
case R.id.login_img_weibo: platform = SHARE_MEDIA.SINA; mShareAPI.doOauthVerify(LoginActivity.this, platform, umAuthListener); break; case R.id.login_img_weixin: platform = SHARE_MEDIA.WEIXIN; mShareAPI.doOauthVerify(LoginActivity.this, platform, umAuthListener); break;下面new
umAuthListener
private UMAuthListener umAuthListener = new UMAuthListener() { @Override public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) { if(platform == SHARE_MEDIA.WEIXIN){ //unionid:(6.2以前用unionid)uid uid = data.get("unionid"); }else{ uid = data.get("uid"); } if(!CheckUtils.isEmpty(uid)){ //如果uid不為空即回撥授權成功,則可以調介面告訴後臺此時的第三方uid,後臺判斷此唯一標識值是否存在即判斷使用者是否用 //第三方登入過,如果登入過直接進入主介面, 沒有登入過則後臺儲存該值並進入註冊介面進行手機號繫結註冊 judgeUMLogin();,如果登入 }else{ Toast.makeText(getApplicationContext(), "暫無法使用該登入方式", Toast.LENGTH_SHORT).show(); } Toast.makeText(getApplicationContext(), "授權成功", Toast.LENGTH_SHORT).show(); Log.d("user info", "user info:" + data.toString()); } @Override public void onError(SHARE_MEDIA platform, int action, Throwable t) { Toast.makeText(getApplicationContext(), "Authorize fail", Toast.LENGTH_SHORT).show(); } @Override public void onCancel(SHARE_MEDIA platform, int action) { Toast.makeText(getApplicationContext(), "Authorize cancel", Toast.LENGTH_SHORT).show(); } };
5、分享
回撥相關配置
如果使用的是qq或者新浪精簡版jar,需要在您使用分享或授權的Activity(fragment不行)中新增如下回調程式碼:
@Override
protectedvoidonActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}
分享相關程式碼呼叫
開啟分享面板
可以通過如下程式碼開啟分享面板選擇頁
new ShareAction(MainActivity.this)
.withText("hello")
.setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.WEIXIN)
.setCallback(umShareListener)
.open();
其中umShareListener為回撥監聽,相關分享結果都在回撥監聽中獲取
構建如下,其中分享成功會回撥onComplete,取消分享回撥onCancel,分享錯誤回撥onError,對應的錯誤資訊可以用過onError的Throwable引數來列印
private UMShareListener umShareListener = new UMShareListener() {
@Override
publicvoidonResult(SHARE_MEDIA platform){
Log.d("plat","platform"+platform);
Toast.makeText(MainActivity.this, platform + " 分享成功啦", Toast.LENGTH_SHORT).show();
}
@Override
publicvoidonError(SHARE_MEDIA platform, Throwable t){
Toast.makeText(MainActivity.this,platform + " 分享失敗啦", Toast.LENGTH_SHORT).show();
if(t!=null){
Log.d("throw","throw:"+t.getMessage());
}
}
@Override
publicvoidonCancel(SHARE_MEDIA platform){
Toast.makeText(MainActivity.this,platform + " 分享取消了", Toast.LENGTH_SHORT).show();
}
};
直接分享介面
對於需要不經過分享面板選擇頁,直接通過按鈕實現某個平臺的分享跳轉操作的開發者,可以呼叫下面的程式碼實現
new ShareAction(MainActivity.this)
.setPlatform(SHARE_MEDIA.QQ)
.withText("hello")
.setCallback(umShareListener)
.share();
具體分享結果獲取方法與使用分享面板相同,這裡不再複述
登入不回撥可能的情況:
1、WXEntryActivity
這個類的路徑問題
2、微信官網的配置要求很嚴格 程式目錄的包名必須與配置檔案的包名還有微信開放平臺配置的包名完全一致。否則會出現回撥無反應現象。(遇到過的)