UMeng.pas 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. {*******************************************************}
  2. { }
  3. { Methods of UMeng }
  4. { }
  5. { CopyRight (C) 2018-2020 KngStr }
  6. { }
  7. {*******************************************************}
  8. unit UMeng;
  9. //https://developer.umeng.com/docs/66632/detail/66889
  10. //delphi 不支持Android 64,所以不能引用64位 so:arm64-v8a
  11. interface
  12. uses
  13. System.Sysutils, System.Generics.Collections;
  14. type
  15. TUMeng = class
  16. private
  17. class var FLastViewName: string;
  18. class function DeviceType(IsPhone: Boolean): Integer;
  19. class procedure Debug;
  20. public
  21. //注意: 即使您已经在AndroidManifest.xml中配置过appkey和channel值,
  22. //也需要在App代码中调用初始化接口(如需要使用AndroidManifest.xml中配置好的appkey和channel值,
  23. //UMConfigure.init调用中appkey和channel参数请置为null)。
  24. class procedure Init(appkey, channel: string; pushSecret: string = ''; IsPhone: Boolean = True); overload;
  25. //注意:如果您已经在AndroidManifest.xml中配置过appkey和channel值,可以调用此版本初始化函数。
  26. class procedure Init(pushSecret: string = ''; IsPhone: Boolean = True); overload;
  27. class procedure onResume;
  28. class procedure onPause;
  29. class procedure onPageStart(ViewName: string);
  30. class procedure onPageEnd(ViewName: string);
  31. class procedure onPageAutoChange(ViewName: string = ''; NeedPauseAndResume: Boolean = False);
  32. //普通事件
  33. class procedure onEvent(AID: string; ALabel: string = #0); overload;
  34. //多属性(K-V)事件
  35. class procedure onEvent(AID: string; AProperties: TArray<TPair<string, string>>); overload;
  36. //数值型
  37. class procedure onEventValue(AID: string; AProperties: TArray<TPair<string, string>>; ADuration: Integer = 0);
  38. //上次访问的页面名
  39. class property LastViewName: string read FLastViewName;
  40. end;
  41. implementation
  42. uses
  43. {$IFDEF ANDROID}
  44. Androidapi.JNI.Os, Androidapi.JNI.Provider,
  45. Androidapi.JNIBridge, Androidapi.Helpers,
  46. Androidapi.JNI.JavaTypes, Androidapi.JNI.App,
  47. Androidapi.JNI.GraphicsContentViewText,
  48. Androidapi.JNI.umeng.common, Androidapi.JNI.umeng.analytics,
  49. {$ENDIF}
  50. FMX.Types;
  51. { TUMeng }
  52. class procedure TUMeng.Debug;
  53. {$IF DEFINED(ANDROID) && DEFINED(DEBUG)}
  54. var
  55. I: Integer;
  56. sDeviceInfo: string;
  57. arrInfo: TJavaObjectArray<JString>;
  58. {$ENDIF}
  59. begin
  60. {$IF DEFINED(ANDROID) && DEFINED(DEBUG)}
  61. (**
  62. * 设置组件化的Log开关
  63. * 参数: boolean 默认为false,如需查看LOG设置为true
  64. *)
  65. TJUMConfigure.JavaClass.setLogEnabled(True);
  66. TJMobclickAgent.JavaClass.setDebugMode(True);
  67. sDeviceInfo := '';
  68. arrInfo := TJUMConfigure.JavaClass.getTestDeviceInfo(
  69. {$IF CompilerVersion > 27}
  70. TAndroidHelper.Context
  71. {$ELSE}
  72. SharedActivityContext
  73. {$ENDIF}
  74. );
  75. for I := 0 to arrInfo.Length - 1 do
  76. sDeviceInfo := Format('%s %s', [sDeviceInfo, JStringToString(arrInfo.Items[I])]);
  77. Log.d('TUMeng-DeviceInfo:' + sDeviceInfo);
  78. //setCatchUncaughtExceptions can not be called in child process
  79. //TJMobclickAgent.JavaClass.setCatchUncaughtExceptions(True);
  80. {$ENDIF}
  81. end;
  82. class procedure TUMeng.onEvent(AID: string; ALabel: string = #0);
  83. begin
  84. {$IFDEF ANDROID}
  85. TJMobclickAgent.JavaClass.onEvent(
  86. {$IF CompilerVersion > 27}
  87. TAndroidHelper.Context
  88. {$ELSE}
  89. SharedActivityContext
  90. {$ENDIF},
  91. StringToJString(AID),
  92. StringToJString(ALabel)
  93. );
  94. {$ENDIF}
  95. end;
  96. class function TUMeng.DeviceType(IsPhone: Boolean): Integer;
  97. begin
  98. {$IFDEF ANDROID}
  99. if IsPhone then
  100. Result := TJUMConfigure.JavaClass.DEVICE_TYPE_PHONE
  101. else
  102. Result := TJUMConfigure.JavaClass.DEVICE_TYPE_BOX;
  103. {$ENDIF}
  104. end;
  105. (**
  106. * 初始化common库
  107. * 参数1:上下文,不能为空
  108. * 参数2:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机
  109. * 参数3:Push推送业务的secret
  110. *)
  111. class procedure TUMeng.Init(pushSecret: string; IsPhone: Boolean);
  112. begin
  113. {$IFDEF DEBUG}
  114. Debug;
  115. {$ENDIF}
  116. FLastViewName := '';
  117. {$IFDEF ANDROID}
  118. TJUMConfigure.TU2Fixinit(
  119. {$IF CompilerVersion > 27}
  120. TAndroidHelper.Context
  121. {$ELSE}
  122. SharedActivityContext
  123. {$ENDIF},
  124. DeviceType(IsPhone),
  125. StringToJString(pushSecret));
  126. {$ENDIF}
  127. end;
  128. (**
  129. * 初始化common库
  130. * 参数1:上下文,不能为空
  131. * 参数2:【友盟+】 AppKey
  132. * 参数3:【友盟+】 Channel
  133. * 参数4:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机
  134. * 参数5:Push推送业务的secret
  135. *)
  136. class procedure TUMeng.Init(appkey, channel, pushSecret: string;
  137. IsPhone: Boolean);
  138. begin
  139. {$IFDEF DEBUG}
  140. Debug;
  141. {$ENDIF}
  142. FLastViewName := '';
  143. {$IFDEF ANDROID}
  144. TJUMConfigure.TU2Fixinit(
  145. {$IF CompilerVersion > 27}
  146. TAndroidHelper.Context
  147. {$ELSE}
  148. SharedActivityContext
  149. {$ENDIF},
  150. StringToJString(appkey),
  151. StringToJString(channel),
  152. DeviceType(IsPhone),
  153. StringToJString(pushSecret));
  154. // 页面采集模式
  155. TJMobclickAgent.JavaClass.setPageCollectionMode(TJMobclickAgent_PageMode.JavaClass.AUTO);
  156. {$ENDIF}
  157. end;
  158. class procedure TUMeng.onEvent(AID: string;
  159. AProperties: TArray<TPair<string, string>>);
  160. begin
  161. onEventValue(AID, AProperties);
  162. end;
  163. class procedure TUMeng.onEventValue(AID: string;
  164. AProperties: TArray<TPair<string, string>>; ADuration: Integer);
  165. {$IFDEF ANDROID}
  166. var
  167. FJMap: JHashMap;
  168. I: Integer;
  169. LProperty: TPair<string, string>;
  170. {$ENDIF}
  171. begin
  172. {$IFDEF ANDROID}
  173. FJMap := TJHashMap.JavaClass.init;
  174. for I := 0 to Length(AProperties) - 1 do
  175. FJMap.put(StringToJString(AProperties[I].Key), StringToJString(AProperties[I].Value));
  176. if ADuration > 0 then
  177. TJMobclickAgent.JavaClass.onEventValue(
  178. {$IF CompilerVersion > 27}
  179. TAndroidHelper.Context
  180. {$ELSE}
  181. SharedActivityContext
  182. {$ENDIF},
  183. StringToJString(AID),
  184. Jmap(FJMap),
  185. ADuration
  186. )
  187. else
  188. TJMobclickAgent.JavaClass.onEvent(
  189. {$IF CompilerVersion > 27}
  190. TAndroidHelper.Context
  191. {$ELSE}
  192. SharedActivityContext
  193. {$ENDIF},
  194. StringToJString(AID),
  195. Jmap(FJMap)
  196. );
  197. {$ENDIF}
  198. end;
  199. class procedure TUMeng.onPageAutoChange(ViewName: string; NeedPauseAndResume: Boolean);
  200. begin
  201. {$IFDEF DEBUG}
  202. Log.d('---onPageAutoChange:' + FLastViewName + '/' + ViewName);
  203. {$ENDIF}
  204. if FLastViewName <> '' then begin
  205. onPageEnd(FLastViewName);
  206. if NeedPauseAndResume then
  207. onPause;
  208. end;
  209. if ViewName <> '' then begin
  210. onPageStart(ViewName);
  211. if NeedPauseAndResume then
  212. onResume;
  213. end;
  214. FLastViewName := ViewName;
  215. end;
  216. class procedure TUMeng.onPageEnd(ViewName: string);
  217. begin
  218. {$IFDEF DEBUG}
  219. Log.d('---onPageEnd:' + ViewName);
  220. {$ENDIF}
  221. {$IFDEF ANDROID}
  222. TJMobclickAgent.JavaClass.onPageEnd(StringToJString(ViewName));
  223. {$ENDIF}
  224. end;
  225. class procedure TUMeng.onPageStart(ViewName: string);
  226. begin
  227. {$IFDEF DEBUG}
  228. Log.d('---onPageStart:' + ViewName);
  229. {$ENDIF}
  230. {$IFDEF ANDROID}
  231. TJMobclickAgent.JavaClass.onPageStart(StringToJString(ViewName));
  232. {$ENDIF}
  233. end;
  234. class procedure TUMeng.onPause;
  235. begin
  236. {$IFDEF DEBUG}
  237. Log.d('---onPause');
  238. {$ENDIF}
  239. {$IFDEF ANDROID}
  240. TJMobclickAgent.JavaClass.onPause(
  241. {$IF CompilerVersion > 27}
  242. TAndroidHelper.Context
  243. {$ELSE}
  244. SharedActivityContext
  245. {$ENDIF}
  246. );
  247. {$ENDIF}
  248. end;
  249. class procedure TUMeng.onResume;
  250. begin
  251. {$IFDEF DEBUG}
  252. Log.d('---onResume');
  253. {$ENDIF}
  254. {$IFDEF ANDROID}
  255. TJMobclickAgent.JavaClass.onResume(
  256. {$IF CompilerVersion > 27}
  257. TAndroidHelper.Context
  258. {$ELSE}
  259. SharedActivityContext
  260. {$ENDIF}
  261. );
  262. {$ENDIF}
  263. end;
  264. end.