unit UMeng; //https://developer.umeng.com/docs/66632/detail/66889 //delphi 不支持Android 64,所以不能引用64位 so:arm64-v8a interface uses System.Sysutils, System.Generics.Collections; type TUMeng = class private class var FLastViewName: string; class function DeviceType(IsPhone: Boolean): Integer; class procedure Debug; public //注意: 即使您已经在AndroidManifest.xml中配置过appkey和channel值, //也需要在App代码中调用初始化接口(如需要使用AndroidManifest.xml中配置好的appkey和channel值, //UMConfigure.init调用中appkey和channel参数请置为null)。 class procedure Init(appkey, channel: string; pushSecret: string = ''; IsPhone: Boolean = True); overload; //注意:如果您已经在AndroidManifest.xml中配置过appkey和channel值,可以调用此版本初始化函数。 class procedure Init(pushSecret: string = ''; IsPhone: Boolean = True); overload; class procedure onResume; class procedure onPause; class procedure onPageStart(ViewName: string); class procedure onPageEnd(ViewName: string); class procedure onPageAutoChange(ViewName: string = ''; NeedPauseAndResume: Boolean = False); //普通事件 class procedure onEvent(AID: string; ALabel: string = #0); overload; //多属性(K-V)事件 class procedure onEvent(AID: string; AProperties: TArray>); overload; //数值型 class procedure onEventValue(AID: string; AProperties: TArray>; ADuration: Integer = 0); //上次访问的页面名 class property LastViewName: string read FLastViewName; end; implementation uses {$IFDEF ANDROID} Androidapi.JNI.Os, Androidapi.JNI.Provider, Androidapi.JNIBridge, Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNI.App, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.umeng.common, Androidapi.JNI.umeng.analytics, {$ENDIF} FMX.Types; { TUMeng } class procedure TUMeng.Debug; {$IF DEFINED(ANDROID) && DEFINED(DEBUG)} var I: Integer; sDeviceInfo: string; arrInfo: TJavaObjectArray; {$ENDIF} begin {$IF DEFINED(ANDROID) && DEFINED(DEBUG)} (** * 设置组件化的Log开关 * 参数: boolean 默认为false,如需查看LOG设置为true *) TJUMConfigure.JavaClass.setLogEnabled(True); TJMobclickAgent.JavaClass.setDebugMode(True); sDeviceInfo := ''; arrInfo := TJUMConfigure.JavaClass.getTestDeviceInfo( {$IF CompilerVersion > 27} TAndroidHelper.Context {$ELSE} SharedActivityContext {$ENDIF} ); for I := 0 to arrInfo.Length - 1 do sDeviceInfo := Format('%s %s', [sDeviceInfo, JStringToString(arrInfo.Items[I])]); Log.d('TUMeng-DeviceInfo:' + sDeviceInfo); //setCatchUncaughtExceptions can not be called in child process //TJMobclickAgent.JavaClass.setCatchUncaughtExceptions(True); {$ENDIF} end; class procedure TUMeng.onEvent(AID: string; ALabel: string = #0); begin {$IFDEF ANDROID} TJMobclickAgent.JavaClass.onEvent( {$IF CompilerVersion > 27} TAndroidHelper.Context {$ELSE} SharedActivityContext {$ENDIF}, StringToJString(AID), StringToJString(ALabel) ); {$ENDIF} end; class function TUMeng.DeviceType(IsPhone: Boolean): Integer; begin {$IFDEF ANDROID} if IsPhone then Result := TJUMConfigure.JavaClass.DEVICE_TYPE_PHONE else Result := TJUMConfigure.JavaClass.DEVICE_TYPE_BOX; {$ENDIF} end; (** * 初始化common库 * 参数1:上下文,不能为空 * 参数2:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机 * 参数3:Push推送业务的secret *) class procedure TUMeng.Init(pushSecret: string; IsPhone: Boolean); begin {$IFDEF DEBUG} Debug; {$ENDIF} FLastViewName := ''; {$IFDEF ANDROID} TJUMConfigure.TU2Fixinit( {$IF CompilerVersion > 27} TAndroidHelper.Context {$ELSE} SharedActivityContext {$ENDIF}, DeviceType(IsPhone), StringToJString(pushSecret)); {$ENDIF} end; (** * 初始化common库 * 参数1:上下文,不能为空 * 参数2:【友盟+】 AppKey * 参数3:【友盟+】 Channel * 参数4:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机 * 参数5:Push推送业务的secret *) class procedure TUMeng.Init(appkey, channel, pushSecret: string; IsPhone: Boolean); begin {$IFDEF DEBUG} Debug; {$ENDIF} FLastViewName := ''; {$IFDEF ANDROID} TJUMConfigure.TU2Fixinit( {$IF CompilerVersion > 27} TAndroidHelper.Context {$ELSE} SharedActivityContext {$ENDIF}, StringToJString(appkey), StringToJString(channel), DeviceType(IsPhone), StringToJString(pushSecret)); // 页面采集模式 TJMobclickAgent.JavaClass.setPageCollectionMode(TJMobclickAgent_PageMode.JavaClass.AUTO); {$ENDIF} end; class procedure TUMeng.onEvent(AID: string; AProperties: TArray>); begin onEventValue(AID, AProperties); end; class procedure TUMeng.onEventValue(AID: string; AProperties: TArray>; ADuration: Integer); {$IFDEF ANDROID} var FJMap: JHashMap; I: Integer; LProperty: TPair; {$ENDIF} begin {$IFDEF ANDROID} FJMap := TJHashMap.JavaClass.init; for I := 0 to Length(AProperties) - 1 do FJMap.put(StringToJString(AProperties[I].Key), StringToJString(AProperties[I].Value)); if ADuration > 0 then TJMobclickAgent.JavaClass.onEventValue( {$IF CompilerVersion > 27} TAndroidHelper.Context {$ELSE} SharedActivityContext {$ENDIF}, StringToJString(AID), Jmap(FJMap), ADuration ) else TJMobclickAgent.JavaClass.onEvent( {$IF CompilerVersion > 27} TAndroidHelper.Context {$ELSE} SharedActivityContext {$ENDIF}, StringToJString(AID), Jmap(FJMap) ); {$ENDIF} end; class procedure TUMeng.onPageAutoChange(ViewName: string; NeedPauseAndResume: Boolean); begin {$IFDEF DEBUG} Log.d('---onPageAutoChange:' + FLastViewName + '/' + ViewName); {$ENDIF} if FLastViewName <> '' then begin onPageEnd(FLastViewName); if NeedPauseAndResume then onPause; end; if ViewName <> '' then begin onPageStart(ViewName); if NeedPauseAndResume then onResume; end; FLastViewName := ViewName; end; class procedure TUMeng.onPageEnd(ViewName: string); begin {$IFDEF DEBUG} Log.d('---onPageEnd:' + ViewName); {$ENDIF} {$IFDEF ANDROID} TJMobclickAgent.JavaClass.onPageEnd(StringToJString(ViewName)); {$ENDIF} end; class procedure TUMeng.onPageStart(ViewName: string); begin {$IFDEF DEBUG} Log.d('---onPageStart:' + ViewName); {$ENDIF} {$IFDEF ANDROID} TJMobclickAgent.JavaClass.onPageStart(StringToJString(ViewName)); {$ENDIF} end; class procedure TUMeng.onPause; begin {$IFDEF DEBUG} Log.d('---onPause'); {$ENDIF} {$IFDEF ANDROID} TJMobclickAgent.JavaClass.onPause( {$IF CompilerVersion > 27} TAndroidHelper.Context {$ELSE} SharedActivityContext {$ENDIF} ); {$ENDIF} end; class procedure TUMeng.onResume; begin {$IFDEF DEBUG} Log.d('---onResume'); {$ENDIF} {$IFDEF ANDROID} TJMobclickAgent.JavaClass.onResume( {$IF CompilerVersion > 27} TAndroidHelper.Context {$ELSE} SharedActivityContext {$ENDIF} ); {$ENDIF} end; end.