Quellcode durchsuchen

友盟工具集成;性能检测、埋点、一键登录;

czq vor 2 Jahren
Ursprung
Commit
590e22dce0

+ 1 - 0
.idea/misc.xml

@@ -16,6 +16,7 @@
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_stars.xml" value="0.12" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_test.xml" value="0.18" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_test2.xml" value="0.17" />
+        <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_umeng_login.xml" value="0.18" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_view.xml" value="0.25" />
       </map>
     </option>

+ 39 - 6
app/build.gradle

@@ -2,7 +2,12 @@ apply plugin: 'com.android.application'
 apply plugin: 'kotlin-android'
 
 apply plugin: 'kotlin-android-extensions' //扩展插件
+static def releaseTime() {
+    return new Date().format("yyyyMMddHHmmss", TimeZone.getTimeZone("GMT+8"))
+}
 
+def name = "Effect"
+def version = "_" + releaseTime() + "_v"
 android {
     compileSdkVersion 30
     buildToolsVersion "30.0.3"
@@ -31,12 +36,35 @@ android {
 //            VIVO_APPID : "vivo的APPID"
         ]
     }
+    signingConfigs {
+        release {
+            storeFile file("effect.jks")
+            storePassword "xunao123"
+            keyAlias "xuantu"
+            keyPassword "xunao123"
+            v1SigningEnabled true
+            v2SigningEnabled true
+        }
 
+        debug {
+            storeFile file("effect.jks")
+            storePassword "xunao123"
+            keyAlias "xuantu"
+            keyPassword "xunao123"
+            v1SigningEnabled true
+            v2SigningEnabled true
+        }
+    }
     buildTypes {
         release {
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
+//        android.applicationVariants.all { variant ->
+//            variant.outputs.all {
+//                outputFileName = "${name}${version}${defaultConfig.versionCode}.apk"
+//            }
+//        }
     }
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_8
@@ -52,11 +80,6 @@ android {
     buildFeatures {
         viewBinding true
     }
-
-//    compileOptions {
-//        targetCompatibility JavaVersion.VERSION_1_8
-//        sourceCompatibility JavaVersion.VERSION_1_8
-//    }
 }
 repositories {
     flatDir {
@@ -82,9 +105,19 @@ dependencies {
     implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
     implementation 'com.airbnb.android:lottie:5.2.0'
     implementation 'com.github.JadeKkang:like_view:v1.0'
-
+    //极光推送
     implementation 'cn.jiguang.sdk:jcore:3.3.0'  // 此处以JCore 3.3.0 版本为例。
     implementation 'cn.jiguang.sdk:jpush:4.7.2'  // 此处以JPush 4.7.2 版本为例
 
+    //友盟
+    implementation  'com.umeng.umsdk:common:9.5.2'// (必选)
+    implementation  'com.umeng.umsdk:asms:1.6.3'// 必选
+    implementation  'com.umeng.umsdk:abtest:1.0.1'//使用U-App中ABTest能力,可选
+    implementation 'com.umeng.umsdk:apm:1.7.0'// U-APM产品包依赖(必选)
+    implementation  'com.umeng.umsdk:uverify:2.5.6'// 必选
+    implementation  'com.umeng.umsdk:uverify-main:2.1.4'// 必选
+    implementation  'com.umeng.umsdk:uverify-logger:2.1.4'// 必选
+    implementation  'com.umeng.umsdk:uverify-crashshield:2.1.4'// 必选
+
 
 }

BIN
app/effect.jks


+ 6 - 0
app/src/main/AndroidManifest.xml

@@ -31,6 +31,10 @@
                 <action android:name="android.intent.action.MAIN" />
 
                 <category android:name="android.intent.category.LAUNCHER" />
+<!--                <action android:name="android.intent.action.VIEW" />-->
+<!--                <category android:name="android.intent.category.DEFAULT" />-->
+<!--                <category android:name="android.intent.category.BROWSABLE" />-->
+<!--                <data android:scheme="um.6304343088ccdf4b7e0d67bb" />-->
             </intent-filter>
         </activity>
         <activity
@@ -92,6 +96,8 @@
                 <category android:name="${applicationId}" />
             </intent-filter>
         </provider>
+
+        <activity android:name=".activity.UMengLoginActivity"/>
     </application>
 
 </manifest>

+ 80 - 23
app/src/main/java/com/xunao/effectdemo/App.java

@@ -1,8 +1,21 @@
 package com.xunao.effectdemo;
 
 import android.app.Application;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
 import android.util.Log;
 
+import com.uc.crashsdk.export.CrashApi;
+import com.umeng.analytics.MobclickAgent;
+import com.umeng.commonsdk.UMConfigure;
+import com.xunao.effectdemo.umeng.UmInitConfig;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Locale;
+
 import cn.jpush.android.api.JPushInterface;
 
 /**
@@ -26,34 +39,78 @@ public class App extends Application {
 		app = this;
 		JPushInterface.setDebugMode(true);
 		JPushInterface.init(this);
-
+//		getSHA1Signature(this);
 	}
 
 	/**
 	 * 初始化友盟SDK
 	 */
 	private void initUmengSDK() {
-		//日志开关
-//		UMConfigure.setLogEnabled(true);
-		//预初始化
-//		PushHelper.preInit(this);
-//		//是否同意隐私政策
-//		boolean agreed = true;
-//		if (!agreed) {
-//			return;
-//		}
-//		boolean isMainProcess = UMUtils.isMainProgress(this);
-//		if (isMainProcess) {
-//			//启动优化:建议在子线程中执行初始化
-//			new Thread(new Runnable() {
-//				@Override
-//				public void run() {
-//					PushHelper.init(getApplicationContext());
-//				}
-//			}).start();
-//		} else {
-//			//若不是主进程(":channel"结尾的进程),直接初始化sdk,不可在子线程中执行
-//			PushHelper.init(getApplicationContext());
-//		}
+//		sharedPreferencesHelper=new SharedPreferencesHelper(this,"umeng");
+
+		//设置LOG开关,默认为false
+		UMConfigure.setLogEnabled(true);
+
+		//友盟预初始化
+		UMConfigure.preInit(getApplicationContext(),"6304343088ccdf4b7e0d67bb","Umeng");
+
+		/**
+		 * 打开app首次隐私协议授权,以及sdk初始化,判断逻辑请查看SplashTestActivity
+		 */
+		//判断是否同意隐私协议,uminit为1时为已经同意,直接初始化umsdk
+		//友盟正式初始化
+		UmInitConfig umInitConfig=new UmInitConfig();
+		umInitConfig.UMinit(getApplicationContext());
+
+		final Bundle customInfo = new Bundle();
+		customInfo.putBoolean("mCallNativeDefaultHandler",true);
+		CrashApi.getInstance().updateCustomInfo(customInfo);
+
+		// 自动采集选择
+		MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);
+
+		// 支持在子进程中统计自定义事件
+		UMConfigure.setProcessEvent(true);
+	}
+
+	public void getSHA1Signature(Context context) {
+		try {
+			PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
+
+			byte[] cert = info.signatures[0].toByteArray();
+
+			MessageDigest md = MessageDigest.getInstance("MD5");
+			byte[] publicKey = md.digest(cert);
+			StringBuilder hexString = new StringBuilder();
+			for (int i = 0; i < publicKey.length; i++) {
+				String appendString = Integer.toHexString(0xFF & publicKey[i])
+						.toUpperCase(Locale.US);
+				if (appendString.length() == 1)
+					hexString.append("0");
+				appendString.replaceAll(":","");
+				hexString.append(appendString);
+				hexString.append(":");
+			}
+			Log.e("MyTag","签名:"+hexString.toString());
+		} catch (PackageManager.NameNotFoundException e) {
+			e.printStackTrace();
+		} catch (NoSuchAlgorithmException e) {
+			e.printStackTrace();
+		}
+	}
+
+
+	/**
+	 * 将给定字符串中给定的区域的字符转换成小写
+	 *
+	 * @param str 给定字符串中
+	 * @param beginIndex 开始索引(包括)
+	 * @param endIndex 结束索引(不包括)
+	 * @return 新的字符串
+	 */
+	public static String toLowerCase(String str, int beginIndex, int endIndex) {
+		return str.replaceFirst(str.substring(beginIndex, endIndex),
+				str.substring(beginIndex, endIndex)
+						.toLowerCase(Locale.getDefault()));
 	}
 }

+ 18 - 1
app/src/main/java/com/xunao/effectdemo/activity/MainActivity.java

@@ -7,8 +7,12 @@ import android.widget.Button;
 
 import androidx.annotation.Nullable;
 
+import com.umeng.analytics.MobclickAgent;
 import com.xunao.effectdemo.R;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * author : 程中强
  * e-mail : 740479946@qq.com
@@ -18,7 +22,8 @@ import com.xunao.effectdemo.R;
  */
 public class MainActivity extends Activity {
 
-	Button btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn10,btn11,btn12,btn13;
+	Button btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,
+			btn9,btn10,btn11,btn12,btn13, btn14;
 	Intent intent;
 
 	@Override
@@ -97,5 +102,17 @@ public class MainActivity extends Activity {
 			intent = new Intent(MainActivity.this,StarsActivity.class);
 			startActivity(intent);
 		});
+
+		btn14 = findViewById(R.id.btn_14);
+		btn14.setOnClickListener(v->{
+			Map<String, Object> music = new HashMap<String, Object>();
+			music.put("music_type", "popular");//自定义参数:音乐类型,值:流行
+			music.put("singer", "JJ22"); //歌手:(林俊杰)JJ
+			music.put("song_name","A_Thousand_Years_Later"); //歌名:一千年以后
+			music.put("song_price",100); //价格:100元
+			MobclickAgent.onEventObject(this, "play_music", music);
+			intent = new Intent(MainActivity.this,UMengLoginActivity.class);
+			startActivity(intent);
+		});
 	}
 }

+ 3 - 1
app/src/main/java/com/xunao/effectdemo/activity/StarsActivity.java

@@ -15,6 +15,7 @@ import android.widget.TextView;
 import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieAnimationView;
+import com.umeng.analytics.MobclickAgent;
 import com.xunao.effectdemo.App;
 import com.xunao.effectdemo.R;
 import com.xunao.effectdemo.bean.World;
@@ -40,6 +41,8 @@ public class StarsActivity extends Activity {
 	protected void onCreate(@Nullable Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
 		setContentView(R.layout.activity_stars);
+
+
 		animationView = findViewById(R.id.lottie_view);
 		animationView.setRepeatCount(0);
 		animationView.setOnClickListener(v->animationView.playAnimation());
@@ -55,7 +58,6 @@ public class StarsActivity extends Activity {
 			startBig(imv4,0);
 			startBig(imv5,500);
 			startBig(imv6,1000);
-			Log.e("MyTag","id:"+ JPushInterface.getRegistrationID(App.getInstance()));
 		});
 
 	}

+ 69 - 0
app/src/main/java/com/xunao/effectdemo/activity/UMengLoginActivity.java

@@ -0,0 +1,69 @@
+package com.xunao.effectdemo.activity;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+import android.widget.Button;
+
+import androidx.annotation.Nullable;
+
+import com.umeng.umverify.UMVerifyHelper;
+import com.umeng.umverify.listener.UMTokenResultListener;
+import com.xunao.effectdemo.R;
+
+/**
+ * author : 程中强
+ * e-mail : 740479946@qq.com
+ * date : 2022/8/2514:50
+ * desc :
+ * version: 1.0
+ */
+public class UMengLoginActivity extends Activity {
+
+	private Button btn_login;
+	private UMVerifyHelper umVerifyHelper;
+	private UMTokenResultListener mTokenListener;
+	@Override
+	protected void onCreate(@Nullable Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		setContentView(R.layout.activity_umeng_login);
+		btn_login = findViewById(R.id.btn_login);
+		btn_login.setOnClickListener(v->{
+			login();
+		});
+	}
+
+	void login(){
+		/*
+		 * 1.初始化获取token实例
+		 */
+		mTokenListener =new UMTokenResultListener(){
+			@Override
+			public void onTokenSuccess(String s) {
+				Log.e("MyTag","获取成功:"+s);
+			}
+
+			@Override
+			public void onTokenFailed(String s) {
+				Log.e("MyTag","获取失败:"+s);
+			}
+		};
+		/*
+		 *   2.初始化SDK实例
+		 */
+		umVerifyHelper = UMVerifyHelper.getInstance(this, mTokenListener);
+		/*
+		 *   3.设置SDK密钥
+		 */
+		umVerifyHelper.setAuthSDKInfo("qa6vJOh8q6cZX0V6dfolfwpXhH7l1KlXKeN6pA6lIZE8wcLGXkw2qJUwVfL9iDTTeTUa+Rvuxq8JM8n+Vff80ZFaFGYeM8kRQ7FYh1cU+NTg6JbVCXJon1Xrv/v2ymn5hDGPATMylMEeqGmHJ7i2kuLgkyJdDn8O9GQlw74aC0S4mVZieC7J12CDOIDg1nAyfl+EJzPBAO6dX/9lVn6VPNOGpRSNxSaBVPyq22s8s6XRE0XdBfKFkSSJuvC7a/bhGY8duQe1QiCoYs7IUMexB8PHHeZUFLhxl+W0j9D+GecPeNkQr7YugQ==");
+		/*
+		 *   4.检测终端网络环境是否支持一键登录或者号码认证
+		 */
+		umVerifyHelper.checkEnvAvailable(1);
+		/*
+		 *   5.若步骤4支持,则根据业务情况,调用预取号或者一键登录接口
+		 *     详见demo接入工程
+		 */
+		umVerifyHelper.getLoginToken(this,5000);
+	}
+}

+ 84 - 0
app/src/main/java/com/xunao/effectdemo/umeng/UmInitConfig.java

@@ -0,0 +1,84 @@
+package com.xunao.effectdemo.umeng;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Handler;
+import android.util.Log;
+import android.widget.RemoteViews;
+import android.widget.Toast;
+
+import com.umeng.analytics.MobclickAgent;
+import com.umeng.commonsdk.UMConfigure;
+import com.xunao.effectdemo.App;
+
+import static android.os.Looper.getMainLooper;
+
+
+public class UmInitConfig {
+
+    private static final String TAG = App.class.getName();
+    public static final String UPDATE_STATUS_ACTION = "com.umeng.message.example.action.UPDATE_STATUS";
+    private Handler handler;
+
+    public  void  UMinit(Context context){
+
+        //初始化组件化基础库, 统计SDK/推送SDK/分享SDK都必须调用此初始化接口
+        UMConfigure.init(context, "6304343088ccdf4b7e0d67bb", "Umeng", UMConfigure.DEVICE_TYPE_PHONE,
+                "669c30a9584623e70e8cd01b0381dcb4");
+
+        String FileProvider = "com.umeng.soexample.fileprovider";
+
+
+        //集成umeng-crash-vx.x.x.aar,则需要关闭原有统计SDK异常捕获功能
+        MobclickAgent.setCatchUncaughtExceptions(false);
+        //PushSDK初始化(如使用推送SDK,必须调用此方法)
+        initUpush(context);
+
+        //统计SDK是否支持采集在子进程中打点的自定义事件,默认不支持
+        UMConfigure.setProcessEvent(true);//支持多进程打点
+
+        // 页面数据采集模式
+        // setPageCollectionMode接口参数说明:
+        // 1. MobclickAgent.PageMode.AUTO: 建议大多数用户使用本采集模式,SDK在此模式下自动采集Activity
+        // 页面访问路径,开发者不需要针对每一个Activity在onResume/onPause函数中进行手动埋点。在此模式下,
+        // 开发者如需针对Fragment、CustomView等自定义页面进行页面统计,直接调用MobclickAgent.onPageStart/
+        // MobclickAgent.onPageEnd手动埋点即可。此采集模式简化埋点工作,唯一缺点是在Android 4.0以下设备中
+        // 统计不到Activity页面数据和各类基础指标(提示:目前Android 4.0以下设备市场占比已经极小)。
+
+        // 2. MobclickAgent.PageMode.MANUAL:对于要求在Android 4.0以下设备中也能正常采集数据的App,可以使用
+        // 本模式,开发者需要在每一个Activity的onResume函数中手动调用MobclickAgent.onResume接口,在Activity的
+        // onPause函数中手动调用MobclickAgent.onPause接口。在此模式下,开发者如需针对Fragment、CustomView等
+        // 自定义页面进行页面统计,直接调用MobclickAgent.onPageStart/MobclickAgent.onPageEnd手动埋点即可。
+
+        // 如下两种LEGACY模式不建议首次集成友盟统计SDK的新用户选用。
+        // 如果您是友盟统计SDK的老用户,App需要从老版本统计SDK升级到8.0.0版本统计SDK,
+        // 并且:您的App之前MobclickAgent.onResume/onPause接口埋点分散在所有Activity
+        // 中,逐个删除修改工作量很大且易出错。
+        // 若您的App符合以上特征,可以选用如下两种LEGACY模式,否则不建议继续使用LEGACY模式。
+        // 简单来说,升级SDK的老用户,如果不需要手动统计页面路径,选用LEGACY_AUTO模式。
+        // 如果需要手动统计页面路径,选用LEGACY_MANUAL模式。
+        // 3. MobclickAgent.PageMode.LEGACY_AUTO: 本模式适合不需要对Fragment、CustomView
+        // 等自定义页面进行页面访问统计的开发者,SDK仅对App中所有Activity进行页面统计,开发者需要在
+        // 每一个Activity的onResume函数中手动调用MobclickAgent.onResume接口,在Activity的
+        // onPause函数中手动调用MobclickAgent.onPause接口。此模式下MobclickAgent.onPageStart
+        // ,MobclickAgent.onPageEnd这两个接口无效。
+
+        // 4. MobclickAgent.PageMode.LEGACY_MANUAL: 本模式适合需要对Fragment、CustomView
+        // 等自定义页面进行手动页面统计的开发者,开发者如需针对Fragment、CustomView等
+        // 自定义页面进行页面统计,直接调用MobclickAgent.onPageStart/MobclickAgent.onPageEnd
+        // 手动埋点即可。开发者还需要在每一个Activity的onResume函数中手动调用MobclickAgent.onResume接口,
+        // 在Activity的onPause函数中手动调用MobclickAgent.onPause接口。
+        MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);
+
+    }
+
+    /**
+     * 主进程和子进程channel都需要进行初始化和注册
+     */
+    private void initUpush(Context context) {
+
+    }
+}

+ 6 - 0
app/src/main/res/layout/activity_main.xml

@@ -85,6 +85,12 @@
             android:text="星星"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"/>
+
+        <Button
+            android:id="@+id/btn_14"
+            android:text="一键登录"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"/>
     </LinearLayout>
 
 </ScrollView>

+ 16 - 0
app/src/main/res/layout/activity_umeng_login.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <Button
+        android:id="@+id/btn_login"
+        android:text="一键登录"
+        android:textSize="30sp"
+        android:textColor="@color/colorWhite"
+        android:background="@color/colorAccent"
+        android:layout_centerInParent="true"
+        android:layout_width="300dp"
+        android:layout_height="80dp"/>
+
+</RelativeLayout>