123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- {*******************************************************}
- { }
- { Methods of UMeng }
- { }
- { CopyRight (C) 2018-2020 KngStr }
- { }
- {*******************************************************}
- 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<TPair<string, string>>); overload;
- //数值型
- class procedure onEventValue(AID: string; AProperties: TArray<TPair<string, string>>; 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<JString>;
- {$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<TPair<string, string>>);
- begin
- onEventValue(AID, AProperties);
- end;
- class procedure TUMeng.onEventValue(AID: string;
- AProperties: TArray<TPair<string, string>>; ADuration: Integer);
- {$IFDEF ANDROID}
- var
- FJMap: JHashMap;
- I: Integer;
- LProperty: TPair<string, string>;
- {$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.
|