登錄與分享自動集成的方式現(xiàn)只支持微信,QQ福压,新浪三個(gè)平臺掏秩,如果需要使用其它平臺請選擇手動集成。
1:添加依賴
latest.integration即最新版本號
//友盟統(tǒng)計(jì)
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'
如果無法正常集成荆姆,則需要在項(xiàng)目的builde.gradle中添加如下配置:
allprojects {
repositories {
mavenCentral()
}
}
2:添加權(quán)限
<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:登錄與分享相關(guān)配置
QQ相關(guān)配置:
在app級別 build.gradle中的 defaultConfig下添加manifestPlaceholders = [qqappid: "你的qq appid"]
不配置會出現(xiàn)下面的錯(cuò)誤:
微信相關(guān)配置:
在包名目錄下創(chuàng)建wxapi文件夾蒙幻,新建一個(gè)名為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:統(tǒng)計(jì)相關(guān)配置:
在app的builde.gradle中配置需要的渠道邮破,對應(yīng)上面的渠道名稱變量。
配置Appkey
<!--value的值填寫你在友盟后臺申請的應(yīng)用Appkey-->
<meta-data android:value="5ac6e5a2b27b0a7200000082" android:name="UMENG_APPKEY"/>
<!--value的值填寫渠道名稱仆救,例如yingyongbao抒和。這里設(shè)置動態(tài)渠道變量-->
<meta-data android:value="${UMENG_CHANNEL_VALUE}" android:name="UMENG_CHANNEL"/>
配置多渠道打包
productFlavors {
Alpha {//自己打包測試使用
// manifestPlaceholders = [UMENG_CHANNEL_VALUE: Alpha]
}
Tencent {//投放應(yīng)用寶市場
// 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 {//投放華為應(yīng)用市場
// manifestPlaceholders = [UMENG_CHANNEL_VALUE: Huawei]
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
在AndroidManifest中注冊WXEntryActivity
5:在applicatio的onCreate()中添加各平臺的第三方key并初始化
第三方賬號申請地址:http://dev.umeng.com/social/android/operation
@Override
public void onCreate() {
super.onCreate();
/**
* 初始化common庫
* 參數(shù)1:上下文,必須的參數(shù)彤蔽,不能為空
* 參數(shù)2:友盟 app key摧莽,非必須參數(shù),如果Manifest文件中已配置app key铆惑,該參數(shù)可以傳空范嘱,則使用Manifest中配置的app key送膳,否則該參數(shù)必須傳入
* 參數(shù)3:友盟 channel,非必須參數(shù)丑蛤,如果Manifest文件中已配置channel叠聋,該參數(shù)可以傳空,則使用Manifest中配置的channel受裹,否則該參數(shù)必須傳入碌补,channel命名請?jiān)斠奵hannel渠道命名規(guī)范
* 參數(shù)4:設(shè)備類型,必須參數(shù)棉饶,傳參數(shù)為UMConfigure.DEVICE_TYPE_PHONE則表示手機(jī)厦章;傳參數(shù)為UMConfigure.DEVICE_TYPE_BOX則表示盒子;默認(rèn)為手機(jī)
* 參數(shù)5:Push推送業(yè)務(wù)的secret照藻,需要集成Push功能時(shí)必須傳入Push的secret袜啃,否則傳空
*/
UMConfigure.init(this,"你的應(yīng)用在友盟上的APPKEY","umeng",UMConfigure.DEVICE_TYPE_PHONE,"");
/**
* 友盟相關(guān)平臺配置。注意友盟官方新文檔中沒有這項(xiàng)配置幸缕,但是如果不配置會吊不起來相關(guān)平臺的授權(quán)界面
*/
PlatformConfig.setWeixin("你的微信APPID", "你的微信AppSecret");//微信APPID和AppSecret
PlatformConfig.setQQZone("你的QQAPPID", "你的QQAppSecret");//QQAPPID和AppSecret
PlatformConfig.setSinaWeibo("你的微博APPID", "你的微博APPSecret","微博的后臺配置回調(diào)地址");//微博
}
6:友盟第三方登錄:
發(fā)起登錄
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授權(quán)
登錄回調(diào)
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方法群发,否則授權(quán)回調(diào)不成功,獲取不到第三方信息发乔。(如果在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:友盟社會化分享
發(fā)起分享
private UMShareListener umShareListener ;
UMImage image = new UMImage(this, R.mipmap.logo);//分享圖標(biāo)
final UMWeb web = new UMWeb("你要分享的地址"); //切記切記 這里分享的鏈接必須是http開頭
web.setTitle("你要分享內(nèi)容的標(biāo)題");//標(biāo)題
web.setThumb(image); //縮略圖
web.setDescription("你要分享內(nèi)容的描述");//描述
分享面板
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("點(diǎn)擊QQ");
new ShareAction(activity).setPlatform(SHARE_MEDIA.QQ)
.withMedia(web)
.setCallback(umShareListener)
.share();
} else if (share_media == SHARE_MEDIA.WEIXIN) {
KLog.e("點(diǎn)擊微信");
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();
分享回調(diào)
umShareListener = new UMShareListener() {
@Override
public void onStart(SHARE_MEDIA platform) {
// 分享開始的回調(diào)
}
@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方法,否則授權(quán)回調(diào)不成功栏尚,獲取不到第三方信息(如果在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:在調(diào)用界面添加動態(tài)申請權(quán)限:
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統(tǒng)計(jì):
即啟動數(shù)據(jù)的統(tǒng)計(jì)(包括新增用戶、活躍用戶译仗、啟動次數(shù)抬虽、使用時(shí)長等基本數(shù)據(jù))
需要在每個(gè)Activity的onResume方法中調(diào)用 MobclickAgent.onResume(Context),
onPause方法中調(diào)用 MobclickAgent.onPause(Context),如下:
protected void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
protected void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
確保在所有的Activity中都調(diào)用 MobclickAgent.onResume() 和onPause()方法古劲。
如果Activity之間有繼承或者控制關(guān)系請不要同時(shí)在父和子Activity中重復(fù)添加nPause和nResume方法斥赋,否則會造成重復(fù)統(tǒng)計(jì)缰猴。例如在BaseActivity中添加過产艾,則它的子類就不需要添加了。
當(dāng)應(yīng)用在后臺運(yùn)行超過30秒(默認(rèn))再回到前端滑绒,將被認(rèn)為是兩個(gè)獨(dú)立的session(啟動)闷堡,例如用戶回到home,或進(jìn)入其他程序疑故,經(jīng)過一段時(shí)間后再返回之前的應(yīng)用杠览。可通過接口:setSessionContinueMillis(long interval) 來自定義這個(gè)間隔(參數(shù)單位為毫秒)纵势。
如果開發(fā)者調(diào)用kill或者exit之類的方法殺死進(jìn)程踱阿,請務(wù)必在此之前調(diào)用onKillProcess(Context context)方法管钳,用來保存統(tǒng)計(jì)數(shù)據(jù)。
Session統(tǒng)計(jì)是比較常用的統(tǒng)計(jì)软舌,友盟還提供了很多統(tǒng)計(jì)方法才漆,例如自定義統(tǒng)計(jì)、錯(cuò)誤統(tǒng)計(jì)佛点、賬號統(tǒng)計(jì)等醇滥,在這就不一一列舉了。有需求的可以參考友盟統(tǒng)計(jì)集成文檔:https://link.jianshu.com/?t=http%3A%2F%2Fdev.umeng.com%2Fsdk_integate%2Fandroid_sdk%2Fanalytics_doc%231