UMeng.pas 7.2 KB

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