登录与分享自动集成的方式现只支持微信,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"]
不配置会出现下面的错误:
![](https://img.haomeiwen.com/i7489305/cd950eab5f546a02.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并初始化
第三方账号申请地址: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
网友评论