Android友盟第三方登入、分享和統計自動整合
登入與分享自動整合的方式現只支援微信,QQ,新浪三個平臺,如果需要使用其它平臺請選擇手動整合。
1:新增依賴
latest.integration即最新版本號
//友盟統計 compile 'com.umeng.sdk:common:latest.integration' compile 'com.umeng.sdk:analytics:latest.integration' //友盟分享 compile 'com.umeng.sdk:share-core:latest.integration' compile 'com.umeng.sdk:share-qq:latest.integration' compile 'com.umeng.sdk:share-wechat:latest.integration' compile 'com.umeng.sdk:share-sina:latest.integration' //分享面板 compile 'com.umeng.sdk:shareboard-widget:latest.integration'
如果無法正常整合,則需要在專案的builde.gradle中新增如下配置:
allprojects { repositories { mavenCentral() } }
2:新增許可權
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
3:登入與分享相關配置
QQ相關配置:
在app級別 build.gradle中的 defaultConfig下新增manifestPlaceholders = [qqappid: "你的qq appid"]
不配置會出現下面的錯誤:

1544497325(1).png
微信相關配置:
在包名目錄下建立wxapi資料夾,新建一個名為WXEntryActivity的activity繼承WXCallbackActivity,裡面不用做操作。
public class WXEntryActivity extends WXCallbackActivity { }
在AndroidManifest中註冊WXEntryActivity
<activity android:name=".wxapi.WXEntryActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
4:統計相關配置:
在app的builde.gradle中配置需要的渠道,對應上面的渠道名稱變數。
配置Appkey
<!--value的值填寫你在友盟後臺申請的應用Appkey--> <meta-data android:value="5ac6e5a2b27b0a7200000082" android:name="UMENG_APPKEY"/> <!--value的值填寫渠道名稱,例如yingyongbao。這裡設定動態渠道變數--> <meta-data android:value="${UMENG_CHANNEL_VALUE}" android:name="UMENG_CHANNEL"/>
配置多渠道打包
productFlavors { Alpha {//自己打包測試使用 // manifestPlaceholders = [UMENG_CHANNEL_VALUE: Alpha] } Tencent {//投放應用寶市場 // manifestPlaceholders = [UMENG_CHANNEL_VALUE: Tencent] } Baidu {//投放百度市場 // manifestPlaceholders = [UMENG_CHANNEL_VALUE: Baidu] } Qihoo {//投放360市場 // manifestPlaceholders = [UMENG_CHANNEL_VALUE: Qihoo] } Alibaba {//投放阿里巴巴 // manifestPlaceholders = [UMENG_CHANNEL_VALUE: Alibaba] } Vivo {//投放vivo市場 // manifestPlaceholders = [UMENG_CHANNEL_VALUE: Vivo] } Oppo {//投放oppo市場 // manifestPlaceholders = [UMENG_CHANNEL_VALUE: Oppo] } Xiaomi {//投放小米市場 // manifestPlaceholders = [UMENG_CHANNEL_VALUE: Xiaomi] } Huawei {//投放華為應用市場 // manifestPlaceholders = [UMENG_CHANNEL_VALUE: Huawei] } productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] } }
在AndroidManifest中註冊WXEntryActivity
5:在applicatio的onCreate()中新增各平臺的第三方key並初始化
第三方賬號申請地址:ofollow,noindex">http://dev.umeng.com/social/android/operation
@Override public void onCreate() { super.onCreate(); /** * 初始化common庫 * 引數1:上下文,必須的引數,不能為空 * 引數2:友盟 app key,非必須引數,如果Manifest檔案中已配置app key,該引數可以傳空,則使用Manifest中配置的app key,否則該引數必須傳入 * 引數3:友盟 channel,非必須引數,如果Manifest檔案中已配置channel,該引數可以傳空,則使用Manifest中配置的channel,否則該引數必須傳入,channel命名請詳見channel渠道命名規範 * 引數4:裝置型別,必須引數,傳引數為UMConfigure.DEVICE_TYPE_PHONE則表示手機;傳引數為UMConfigure.DEVICE_TYPE_BOX則表示盒子;預設為手機 * 引數5:Push推送業務的secret,需要整合Push功能時必須傳入Push的secret,否則傳空 */ UMConfigure.init(this,"你的應用在友盟上的APPKEY","umeng",UMConfigure.DEVICE_TYPE_PHONE,""); /** * 友盟相關平臺配置。注意友盟官方新文件中沒有這項配置,但是如果不配置會弔不起來相關平臺的授權介面 */ PlatformConfig.setWeixin("你的微信APPID", "你的微信AppSecret");//微信APPID和AppSecret PlatformConfig.setQQZone("你的QQAPPID", "你的QQAppSecret");//QQAPPID和AppSecret PlatformConfig.setSinaWeibo("你的微博APPID", "你的微博APPSecret","微博的後臺配置回撥地址");//微博 }
6:友盟第三方登入:
發起登入
private UMShareAPI umShareAPI; private UMAuthListener umAuthListener; mShareAPI = UMShareAPI.get(this); mShareAPI.getPlatformInfo(this, SHARE_MEDIA.QQ, umAuthListener);//QQ登入 mShareAPI.deleteOauth(this, SHARE_MEDIA.QQ, umAuthListener);//撤銷QQ授權
登入回撥
umAuthListener = new UMAuthListener() { @Override public void onStart(SHARE_MEDIA platform) {} @Override public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) { // Logger.e("openid: " + data.get("uid")); // Logger.e("暱稱: " + data.get("name")); // Logger.e("頭像: " + data.get("iconurl")); // Logger.e("性別: " + data.get("gender")); } @Override public void onError(SHARE_MEDIA platform, int action, Throwable t) { } @Override public void onCancel(SHARE_MEDIA platform, int action) { } };
在使用介面中要新增onActivityResult方法,否則授權回撥不成功,獲取不到第三方資訊。(如果在fragment中使用第三方登入,則在依附的activity中重寫此方法)
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data); }
7:友盟社會化分享
發起分享
private UMShareListener umShareListener ; UMImage image = new UMImage(this, R.mipmap.logo);//分享圖示 final UMWeb web = new UMWeb("你要分享的地址"); //切記切記 這裡分享的連結必須是http開頭 web.setTitle("你要分享內容的標題");//標題 web.setThumb(image);//縮圖 web.setDescription("你要分享內容的描述");//描述
分享面板
new ShareAction(activity) .setDisplayList(SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE, SHARE_MEDIA.WEIXIN,SHARE_MEDIA.WEIXIN_CIRCLE) .setShareboardclickCallback(new ShareBoardlistener() { @Override public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) { if (share_media == SHARE_MEDIA.QQ) { KLog.e("點選QQ"); new ShareAction(activity).setPlatform(SHARE_MEDIA.QQ) .withMedia(web) .setCallback(umShareListener) .share(); } else if (share_media == SHARE_MEDIA.WEIXIN) { KLog.e("點選微信"); new ShareAction(activity).setPlatform(SHARE_MEDIA.WEIXIN) .withMedia(web) .setCallback(umShareListener) .share(); } else if (share_media == SHARE_MEDIA.QZONE) { new ShareAction(activity).setPlatform(SHARE_MEDIA.QZONE) .withMedia(web) .setCallback(umShareListener) .share(); } else if (share_media == SHARE_MEDIA.WEIXIN_CIRCLE) { new ShareAction(activity).setPlatform(SHARE_MEDIA.WEIXIN_CIRCLE) .withMedia(web) .setCallback(umShareListener) .share(); } } }).open();
分享回撥
umShareListener = new UMShareListener() { @Override public void onStart(SHARE_MEDIA platform) { // 分享開始的回撥 } @Override public void onResult(SHARE_MEDIA platform) { Toast.makeText(ShareActivity.this, platform + " 分享成功啦", Toast.LENGTH_SHORT).show(); } @Override public void onError(SHARE_MEDIA platform, Throwable t) { Toast.makeText(ShareActivity.this,platform + " 分享失敗啦", Toast.LENGTH_SHORT).show(); } @Override public void onCancel(SHARE_MEDIA platform) { Toast.makeText(ShareActivity.this,platform + " 分享取消了", Toast.LENGTH_SHORT).show(); } };
在使用介面中要新增onActivityResult方法,否則授權回撥不成功,獲取不到第三方資訊(如果在fragment中使用第三方登入,則在依附的activity中重寫此方法)
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data); }
8:在呼叫介面新增動態申請許可權:
if(Build.VERSION.SDK_INT>=23){ String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.CALL_PHONE,Manifest.permission.READ_LOGS,Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.SET_DEBUG_APP,Manifest.permission.SYSTEM_ALERT_WINDOW,Manifest.permission.GET_ACCOUNTS,Manifest.permission.WRITE_APN_SETTINGS}; ActivityCompat.requestPermissions(this,mPermissionList,123); }
9:友盟Session統計:
即啟動資料的統計(包括新增使用者、活躍使用者、啟動次數、使用時長等基本資料)
需要在每個Activity的onResume方法中呼叫 MobclickAgent.onResume(Context),
onPause方法中呼叫 MobclickAgent.onPause(Context),如下:
protected void onResume() { super.onResume(); MobclickAgent.onResume(this); } protected void onPause() { super.onPause(); MobclickAgent.onPause(this); }
確保在所有的Activity中都呼叫 MobclickAgent.onResume() 和onPause()方法。
如果Activity之間有繼承或者控制關係請不要同時在父和子Activity中重複新增nPause和nResume方法,否則會造成重複統計。例如在BaseActivity中新增過,則它的子類就不需要添加了。
當應用在後臺執行超過30秒(預設)再回到前端,將被認為是兩個獨立的session(啟動),例如使用者回到home,或進入其他程式,經過一段時間後再返回之前的應用。可通過介面:setSessionContinueMillis(long interval) 來自定義這個間隔(引數單位為毫秒)。
如果開發者呼叫kill或者exit之類的方法殺死程序,請務必在此之前呼叫onKillProcess(Context context)方法,用來儲存統計資料。
Session統計是比較常用的統計,友盟還提供了很多統計方法,例如自定義統計、錯誤統計、賬號統計等,在這就不一一列舉了。有需求的可以參考友盟統計整合文件:https://link.jianshu.com/?t=http%3A%2F%2Fdev.umeng.com%2Fsdk_integate%2Fandroid_sdk%2Fanalytics_doc%231