演示demo下载:
--- 支持三大功能:* 分享
QQ好友、QQ空间、微信好友、微信朋友圈、新浪微博、钉钉、复制链接
* 第三方登录
QQ、微信、新浪微博
* 统计
应用时长、页面跳转、自定义事件(计数事件、计算事件)
+++
添加县市报的私有Maven仓库路径:
buildscript {
repositories {
// 添加县市报本地Maven仓库
maven { url "http://10.100.62.98:8086/nexus/content/groups/public" }
}
}
allprojects {
repositories {
// 添加县市报本地Maven仓库
maven { url "http://10.100.62.98:8086/nexus/content/groups/public" }
}
}
+++
minSdkVersion不得小于15
android {
compileSdkVersion 26
defaultConfig {
// 最小支持sdk=15
minSdkVersion 15
manifestPlaceholders = [
"UMENG_APP_KEY": UMENG_APP_KEY, //友盟App Key
"QQ_APP_ID" : QQ_APP_ID, //QQ AppId
"_packagename" : _packagename //主项目包名
]
}
}
dependencies {
// 县市报友盟助手
implementation 'com.xsb.umeng:xsb-umeng-tools:1.0.2-SNAPSHOT'.
}
configurations.all {
// 针对使用SNAPSHOT,每次不更新的问题。当有新的SNAPSHOT提交,只需要更改数字后同步即可
resolutionStrategy.cacheChangingModulesFor 4, 'seconds'
}
+++
微信和钉钉需要在app包下新建各自的回调Activity:
-
微信路径:
your_package_name.wxapi.WXEntryActivity,并且继承WXCallbackActivity
/**
* 微信回调
*/
public class WXEntryActivity extends WXCallbackActivity {
}
+++
-
钉钉路径:
your_package_name.ddshare.DDShareActivity,并且继承DingCallBack
/**
* 钉钉回调
*/
public class DDShareActivity extends DingCallBack {
}
+++
需要在项目的gradle.properties文件内填写以下所需的账号信息,填充ManifestPlaceHolder:
# App在友盟注册后的App Key
UMENG_APP_KEY=5b57d0b9a40fa379c4000118
# App在QQ开放平台注册后的App ID
QQ_APP_ID=1107128079
# App的包名
_packagename = com.zjonline.xsb_tools.umeng.demo
+++
友盟相关的配置已经集成在lib aar的AndroidManifest文件中,app打包时会自动合并清单 +++
Application中初始化:
UMengTools.create(applicationContext)
/**
* 是否开启调试模式(开启后有debug日志输出,同时友盟后台开启集成测试)
* 开发阶段必须开启集成测试功能,防止友盟统计数据污染正式环境!!!
* 上线发布前务必再将此开关设置为false!!!
* 默认false
*/
.setLogEnabled(BuildConfig.DEBUG)
// 是否加密友盟数据传输,保证数据安全性,默认false
.setEncryptEnabled(true)
// 是否每次第三方登录都弹出用户授权页面,默认false
.setNeedAuthOn3rdLogin(true)
// 设置QQ开放平台注册的app id和app secret
.setQQZone("QQ App ID", "QQ App Key")
// 设置微信开放平台注册的app id和app secret
.setWeixin("WX App ID", "WX App Secret")
// 设置新浪微博开放平台注册的app id和app secret和重定向url
.setSinaWeibo("Sina App ID", "Sina App Secret", "Sina Redirect Url")
// 设置钉钉开放平台注册的app id
.setDingDing("DingTalk App ID")
/**
* 设置向友盟申请的app secretKey(需要企业认证),防止统计数据被盗刷。
* 默认不设置,没有二次安全验证,数据可能被盗刷
*/
.setAnalyticsSecret("UMeng App Secret")
// 按app自有账号系统进行统计
.setAnalyticsWithUser("10035")
// 按第三方账号系统进行统计
.setAnalyticsWithUser("QQ", "40745050")
/**
* 是否启用默认的页面自动统计功能
* 建议禁用,采用手动统计Activity,fragment,及其他View的数据
* 默认true
*/
.setAnalyticsAutoTrack(false)
/**
* 设置统计功能的session超时时间间隔,单位ms
* 例如:当一个onResume方法与上一个Activity的onPause方法相差30秒,标志新Session的开始
* 默认30000
*/
.setAnalyticsSessionTimeout(30 * 1000)
// 设置统计场景的类型,NORMAL:普通app,GAME:游戏app,默认NORMAL
.setAnalyticsType(AnalyticsType.NORMAL)
// 是否启用错误日志的抓取上报,默认true
.setAnalyticsWithExceptions(true);
友盟分享需要以下两项系统权限,需要app自行实现权限检测和用户交互:
1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+++
目前lib支持三种类型的社交内容分享:
-
纯文本 (QQ好友除外)
new UMengShare.TextBuilder(activity) .text(message) // 文本内容 .platform(platformType) // 目标平台 .callback(mUMengShareSimpleListener) // 分享回调 .share();
+++
-
图片
new UMengShare.ImageBuilder(activity) .image(imageUrl) // 网络图片 .image(imageDrawable) // 图片资源 .image(imageFile) // 本地文件 .image(bitmap) // Bitmap .image(imageBytes) // 字节流 .compress(ImageCompressStyle.SCALE) // 压缩方式,SCALE:压缩尺寸,QUALITY:压缩质量,默认:SCALE .format(Bitmap.CompressFormat.JPEG) // 压缩格式,PNG/JPEG/WEBP,默认:JPEG .platform(platformType) // 目标平台 .callback(mUMengShareSimpleListener) // 分享回调 .share();
+++
-
链接
new UMengShare.LinkBuilder(activity) .url(linkUrl) // 链接地址 .title(linkTitle) // 链接标题 .description(linkDescription) // 链接描述 .image(imageUrl) // 网络图片 .image(imageDrawable) // 图片资源 .image(imageFile) // 本地文件 .image(bitmap) // Bitmap .image(imageBytes) // 字节流 .compress(ImageCompressStyle.SCALE) // 压缩方式,SCALE:压缩尺寸,QUALITY:压缩质量,默认:SCALE .format(Bitmap.CompressFormat.JPEG) // 压缩格式,PNG/JPEG/WEBP,默认:JPEG .platform(platformType) // 目标平台 .callback(mUMengShareSimpleListener) // 分享回调 .share();
+++
- 复制链接
new UMengShare.LinkBuilder(activity) .url(linkUrl) .copyLink(mUMengShareSimpleListener);
+++
/**
* 分享回调精简
*/
public abstract class UMengShareSimpleListener implements UMengShareListener {
/**
* 分享开始
* @param platformType 目标平台
*/
@Override
public void onStart(PlatformType platformType) {
}
/**
* 分享成功
* @param platformType 目标平台
*/
@Override
public void onResult(PlatformType platformType) {
}
/**
* 分享失败
* @param platformType 目标平台
* @param errorMsg 错误信息
*/
@Override
public void onError(PlatformType platformType, String errorMsg) {
}
/**
* 分享取消
* @param platformType 目标平台
*/
@Override
public void onCancel(PlatformType platformType) {
}
/**
* 复制链接
* @param copied 是否已复制
* @param url 要复制的链接地址
* @param msg 提示信息
*/
@Override
public void onCopyLink(boolean copied, String url, String msg) {
}
/**
* 设备不支持该平台
* @param platformType 目标平台
* @param msg 提示信息
*/@Override
public void onNotSupported(PlatformType platformType, String msg) {
}
/**
* 权限被拒绝
* @param platformType 目标平台
* @param permissions 被拒绝的权限列表
*/
@Override
public void onPermissionDenied(PlatformType platformType, String... permissions) {
}
}
+++
QQ和新浪微博分享:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 执行回调传递
UMengTools.onActivityResult(this, requestCode, resultCode, data);
}
+++
分享对象释放
@Override
protected void onDestroy() {
// 释放友盟对象
UMengTools.release(this);
super.onDestroy();
}
目前支持以下三个平台:
-
QQ
-
微信
需开通微信开放平台开发者资质,需要企业认证及缴年费,否则无法完成微信授权登录
-
新浪微博
需要在新浪微博开放平台上注册app,并已上线才能通过审核,否则无法完成微博的授权登录 +++
new UMengOAuth(activity)
.to(platformType) // 目标平台
.callback(mUMengOAuthListener) // 授权回调
.login();
+++
/**
* 第三方登录授权回调
*/
public abstract class UMengOAuthSimpleListener implements UMengOAuthListener {
/**
* 授权开始
* @param platformType 目标平台
*/
@Override
public void onStart(PlatformType platformType) {
}
/**
* 授权成功
* @param platformType 目标平台
* @param oAuthUserInfo 用户信息
*/
@Override
public void onComplete(PlatformType platformType, UMengOAuthUserInfo oAuthUserInfo) {
}
/**
* 授权失败
* @param platformType 目标平台
* @param errorMsg 错误信息
*/
@Override
public void onError(PlatformType platformType, String errorMsg) {
}
/**
* 授权取消
* @param platformType 目标平台
*/
@Override
public void onCancel(PlatformType platformType) {
}
/**
* 设备不支持该平台
* @param platformType 目标平台
* @param msg 提示信息
*/@Override
public void onNotSupported(PlatformType platformType, String msg) {
}
/**
* 权限被拒绝
* @param platformType 目标平台
* @param permissions 被拒绝的权限列表
*/
@Override
public void onPermissionDenied(PlatformType platformType, String... permissions) {
}
}
+++
授权成功返回用户基本信息
/**
* 第三方登录授权获取的用户信息
*/
public class UMengOAuthUserInfo {
private String uid; // 用户id
private String openid; // openid(微信)
private String unionid; //unionid(微信)
//微信返回的openID和unionID都可以实现用户标识的需求
//二者的区别在于,unionID可以实现同一个开发者账号下的应用之间账号打通的需求
private String name; // 用户名
private String accessToken; // 访问用token
private String RefreshToken; // 刷新用token
private String expiration; // token过期时间
private String location; // 用户位置
private String iconurl; // 用户头像
private String gender; // 用户性别
private String country; // 国家
private String province; // 省份
private String city; // 城市
private String followers_count; // 关注数(新浪微博)
private String friends_count; // 好友数(新浪微博)
private String is_yellow_year_vip; // 是否是黄钻(QQ)
private String yellow_vip_level; // 黄钻等级(QQ)
}
+++
授权登录也需要在Activity的onActivityResult传递返回值:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 执行回调传递
UMengTools.onActivityResult(this, requestCode, resultCode, data);
}
+++
用户退出登录或其他需要清除授权状态:
//删除全部平台的授权
UMengOAuth.clearOAuth(Context activity);
//删除指定平台的授权
UMengOAuth.clearOAuth(Context activity,PlatformType... platformTypes);
+++
释放相关对象
@Override
protected void onDestroy() {
// 释放友盟对象
UMengTools.release(this);
super.onDestroy();
}
测试统计前必须先完成以下步骤:
-
在友盟后台中开启App的集成测试功能
-
通过友盟助手的设备信息采集接口获取手机的设备信息:
UMengTools.getTestDeviceInfo(context);
-
在友盟后台集成测试功能中添加测试设备,提交上面设备信息接口返回的如下格式数据:
{"device_id":"861337030615565","mac":"74:ac:5f:99:79:98"}
+++ 友盟统计主要分为以下几种情况:
一、应用时长
二、页面跳转
三、自定义事件
1.计数事件
2.计算事件
+++
友盟统计需要以下系统权限,需要app自行实现权限检测和用户交互:
1. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
建议在app启动时尽早获取,因为涉及页面统计 +++
app的使用时长,onResume和onPause中添加:
@Override
protected void onResume() {
super.onResume();
//这里Activity只统计时长,不统计页面名称。
//如果不需要统计Activity内fragment或view的跳转,pageName则可以设置为Activity的页面名称
UMengAnalytics.onPageStart(this, null);
}
@Override
protected void onPause() {
super.onPause();
//这里Activity只统计时长,不统计页面名称
//如果不需要统计Activity内fragment或view的跳转,pageName则可以设置为Activity的页面名称
UMengAnalytics.onPageEnd(this, null);
}
+++ 注意事项:
-
onPageStart和onPageEnd必须成对调用
-
不能线性交叉调用,必须保证前一对调用完成,才能线性开始下一对调用,不然统计数据不准确 +++
- 只记录Activity的页面跳转:
UMengAnalytics.onPageStart(activity, "activity name");
UMengAnalytics.onPageEnd(activity, "activity name");
-
记录Activity内的Fragment或View的跳转:
1.对应的Activity只记录停留时长 UMengAnalytics.onPageStart(activity, null); UMengAnalytics.onPageEnd(activity, null); 2.Activity内的Fragment或View的跳转时线性成对的调用以下两个方法: UMengAnalytics.onPageStart("page name"); UMengAnalytics.onPageEnd("page name");
+++
-
计数事件
计数事件是用来记录事件的发生次数,每个事件对应一个唯一的事件ID,需要在友盟后台添加所需要的事件ID:
+++ 1.只发送事件ID:
new UMengAnalytics.CountEvent(context)
.id(eventId)
.record();
+++ 2.发送事件ID和事件标签:
new UMengAnalytics.CountEvent(context)
.id(eventId)
.label(label)
.record();
+++ 3.发送事件ID和事件属性键值对,用来详细描述事件的属性:
new UMengAnalytics.CountEvent(context)
.id(eventId)
.withMap(Map<String,String> extras)
.record();
+++ 或者
new UMengAnalytics.CountEvent(context)
.id(eventId)
.with(key1,value1)
.with(key2,value2)
.with(key3,value3)
.record();
+++
-
计算事件
计算事件是用来记录事件的消费时间长度或者有价值的数值统计,例如用户看了某个视频多长秒,等等。每个事件对应有一个32位整形参数: +++ 1.只发送事件ID和事件值:
new UMengAnalytics.CalculateEvent(context)
.id(eventId)
.duration(value)
.record();
+++ 2.发送事件ID、事件属性和事件值:
new UMengAnalytics.CalculateEvent(context)
.id(eventId)
.withMap(extras)
.duration(value)
.record();
+++ 或者
new UMengAnalytics.CalculateEvent(context)
.id(eventId)
.with(key1,value1)
.with(key2,value2)
.with(key3,value3)
.duration(value)
.record();
+++
如果遇到手动杀app进程的情况,需要在kill之前调用如下方法,保证之前的统计数据得到保存:
// kill app之前保存统计
UMengAnalytics.onKillProcess(context);
...
System.exit(0);
...
+++
如果需要按照app自身账号体系来统计数据,则参考以下方式: +++
- app启动时读取之前的登录状态,如果已经登录,则在友盟助手初始化时即可绑定之前登录的账户:
UMengTools.create(applicationContext)
...
.setAnalyticsWithUser("10035") // 按app自有账号系统进行统计
.setAnalyticsWithUser("QQ","40745050") // 或者如果之前是第三方登录的,则可以绑定第三方的用户账号
...
+++
- 若app启动时未登录,则用户登录后,可以调用以下方法进行统计账号的绑定:
UMengAnalytics.setAnalyticsWithUser("10035"); // 按app自有账号系统进行统计
UMengAnalytics.setAnalyticsWithUser("QQ","40745050"); // 或者如果是第三方登录的,则可以绑定第三方的用户账号
+++
- 若账号退出时需要解绑统计账号,则可以如下调用进行统计账号的解绑:
UMengAnalytics.setAnalyticsWithoutUser(); // 解绑统计账号
Thanks