APIModuleGis.java 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147
  1. package com.example.moduleGis;
  2. import android.Manifest;
  3. import android.app.Activity;
  4. import android.app.AlertDialog;
  5. import android.bluetooth.BluetoothAdapter;
  6. import android.content.Context;
  7. import android.content.DialogInterface;
  8. import android.content.DialogInterface.OnClickListener;
  9. import android.content.Intent;
  10. import android.content.pm.PackageManager;
  11. import android.net.Uri;
  12. import android.os.Build;
  13. import android.os.Vibrator;
  14. import android.provider.Settings;
  15. import android.support.annotation.NonNull;
  16. import android.support.v4.app.ActivityCompat;
  17. import android.support.v4.content.ContextCompat;
  18. import android.util.Log;
  19. import android.view.Gravity;
  20. import android.view.ViewGroup;
  21. import android.view.animation.Animation;
  22. import android.view.animation.TranslateAnimation;
  23. import android.widget.RelativeLayout;
  24. import android.widget.TextView;
  25. import android.widget.Toast;
  26. import com.example.moduleGis.gnsstest.DiffConnectManager;
  27. import com.example.moduleGis.gnsstest.GnssListener;
  28. import com.example.moduleGis.gnsstest.GnssServiceManager;
  29. import com.example.moduleGis.gnsstest.ReceiverConnectProxy;
  30. import com.example.moduleGis.gnsstest.consts.BleStatusDefine;
  31. import com.example.moduleGis.gnsstest.event.GnssConnectStatusEvent;
  32. import com.example.moduleGis.gnsstest.event.GnssServiceStatusEvent;
  33. import com.example.moduleGis.gnsstest.event.ReceiverConnectStatusEvent;
  34. import com.example.moduleGis.gnsstest.utils.BlueUtils;
  35. import com.example.moduleGis.gnsstest.utils.SdcardUtils;
  36. import com.huace.gnssserver.GnssToolApp;
  37. import com.huace.gnssserver.app.GnssServerEnvironment;
  38. import com.huace.gnssserver.app.ILog;
  39. import com.huace.gnssserver.gnss.data.GnssInfo;
  40. import com.huace.gnssserver.gnss.data.receiver.CorsInfo;
  41. import com.huace.gnssserver.gnss.data.receiver.ReceiverInfo;
  42. import com.huace.gnssserver.gnss.data.receiver.WorkWay;
  43. import com.pop.android.net.security.StringUtil;
  44. import com.uzmap.pkg.uzcore.UZWebView;
  45. import com.uzmap.pkg.uzcore.uzmodule.ModuleResult;
  46. import com.uzmap.pkg.uzcore.uzmodule.UZModule;
  47. import com.uzmap.pkg.uzcore.uzmodule.UZModuleContext;
  48. import org.greenrobot.eventbus.EventBus;
  49. import org.greenrobot.eventbus.Subscribe;
  50. import org.greenrobot.eventbus.ThreadMode;
  51. import org.json.JSONArray;
  52. import org.json.JSONException;
  53. import org.json.JSONObject;
  54. import java.text.SimpleDateFormat;
  55. import java.util.Date;
  56. import java.util.List;
  57. import java.util.Locale;
  58. import java.util.TimeZone;
  59. import java.util.Timer;
  60. import java.util.TimerTask;
  61. /**
  62. * 该类映射至Javascript中moduleDemo对象<br><br>
  63. * <strong>Js Example:</strong><br>
  64. * var module = api.require('moduleDemo');<br>
  65. * module.xxx();
  66. * @author APICloud
  67. *
  68. */
  69. public class APIModuleGis extends UZModule {
  70. private static final String TAG = "APIModuleGis";
  71. static final int ACTIVITY_REQUEST_CODE_A = 100;
  72. private AlertDialog.Builder mAlert;
  73. private Vibrator mVibrator;
  74. private UZModuleContext mJsCallback;
  75. private MyTextView mMyTextView;
  76. private volatile String wgslng = "0.0";
  77. private volatile String wgslat = "0.0";
  78. private volatile String wgsblh = "0.0";
  79. private volatile String postType = "";
  80. public APIModuleGis(UZWebView webView) {
  81. super(webView);
  82. }
  83. public volatile static String bindCode = "";//绑定状态:0 绑定成功 1 绑定失败
  84. private volatile static String connectCode = "";//连接状态:0连接成功 1:连接失败
  85. private volatile static String logCorsCod = "";//连接状态:0登录成功 1:登录失败
  86. //TODO Lx 统一断开所有的服务
  87. public ModuleResult jsmethod_stopAllService_sync(final UZModuleContext context){
  88. JSONObject res = new JSONObject();
  89. try {
  90. res.put("code", "0");
  91. res.put("msg", "");
  92. DiffConnectManager.loginOutCors(this.context());
  93. //TODO 无异常
  94. logCorsCod = "1";
  95. ReceiverConnectProxy.getInstance().disConnect();
  96. //TODO 无异常
  97. connectCode = "1";
  98. onUnBindClick();
  99. bindCode = "1";
  100. }catch(Exception ex){
  101. Log.i(TAG,ex.getLocalizedMessage());
  102. }
  103. return new ModuleResult(res);
  104. }
  105. //TODO Lx 获取经纬度
  106. public ModuleResult jsmethod_gisLatLng_sync(final UZModuleContext context){
  107. String code = "1";//0表示成功;1表示失败
  108. String msg = "";//状态信息
  109. JSONObject res = new JSONObject();
  110. try {
  111. res.put("code",code);
  112. res.put("msg",msg);
  113. res.put("version","1.1.0");
  114. BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
  115. if (adapter == null) {
  116. res.put("code","2");
  117. res.put("msg","本机没有找到蓝牙硬件或驱动!");
  118. return new ModuleResult(res);
  119. } else {
  120. if (!adapter.isEnabled()) {
  121. //直接开启蓝牙
  122. adapter.enable();
  123. }
  124. }
  125. if (ContextCompat.checkSelfPermission(this.context(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  126. res.put("code","3");
  127. res.put("msg","定位授权:请授予APP位置访问权限,以便应用可检测外围设备");
  128. return new ModuleResult(res);
  129. }
  130. //TODO 连接相关判断
  131. String rtkName = context.optString("rtkName");
  132. // if(rtkName==null||"".equals(rtkName)){
  133. // res.put("code","4");
  134. // res.put("msg","配对设备参数不存在");
  135. // return new ModuleResult(res);
  136. // }
  137. //打开蓝牙
  138. if (!BlueUtils.isOpen()) {
  139. //Util.showOnUiThreadToast(this, "请打开蓝牙进行手机蓝牙配对!");
  140. // errorPromote(this, "温馨提示", "请在设置页面打开手机蓝牙配对连接!");
  141. res.put("code","5");
  142. res.put("msg","请在设置页面打开手机蓝牙配对连接!");
  143. return new ModuleResult(res);
  144. }
  145. List<String> arrBle = BlueUtils.getBluetoothDevice(BleStatusDefine.CONNECTED);
  146. if (arrBle != null && arrBle.size() > 0) {
  147. for (int i = arrBle.size() - 1; i >= 0; i--) {
  148. if (!arrBle.get(i).startsWith("GNSS"))
  149. arrBle.remove(i);
  150. }
  151. }
  152. if (arrBle == null || arrBle.size() <= 0) {
  153. // errorPromote(this, "温馨提示", "没有已配对连接的RTK蓝牙设备!");
  154. res.put("code","6");
  155. res.put("msg","没有已配对连接的RTK蓝牙设备!");
  156. return new ModuleResult(res);
  157. }
  158. if(!arrBle.contains(rtkName)){
  159. res.put("code","7");
  160. res.put("msg","您选择的设备"+rtkName+"未配对,请重新选择或在手机蓝牙设置页重新配对");
  161. return new ModuleResult(res);
  162. }
  163. code = "0";
  164. res.put("code", code);
  165. JSONObject gisObj = new JSONObject();
  166. if(!"0.0".equals(wgslat)&&!"0.0".equals(wgslng)) {
  167. gisObj.put("wgslat", wgslat);
  168. gisObj.put("wgslng", wgslng);
  169. gisObj.put("wgsblh", wgsblh);
  170. }else{
  171. gisObj.put("wgslat", "0.0".equals(wgslat)?"":wgslat);
  172. gisObj.put("wgslng", "0.0".equals(wgslng)?"":wgslng);
  173. gisObj.put("wgsblh", "0.0".equals(wgsblh)?"":wgsblh);
  174. }
  175. gisObj.put("postType", postType);
  176. //TODO 连接状态返回
  177. gisObj.put("bindCode",bindCode);
  178. gisObj.put("connectCode",connectCode);
  179. gisObj.put("logCorsCod",logCorsCod);
  180. //TODO 当前连接的信息
  181. gisObj.put("ramRtkName",ramRtkName);//RTK设备名称
  182. gisObj.put("ramIp",ramIp);//corsIp
  183. gisObj.put("ramPort",ramPort);//端口
  184. gisObj.put("ramMountName",ramMountName);//源名称
  185. gisObj.put("ramCorsUserName",ramCorsUserName);//用户名
  186. gisObj.put("ramCorsPassword",ramCorsPassword);//密码
  187. res.put("data", gisObj);
  188. //TODO 大逻辑 是否重连判断
  189. // String rtkName = context.optString("rtkName");
  190. //TODO cors相关判断 , 全传就登录, 有一个没传就不登
  191. String ip = context.optString("ip");
  192. Integer port = Integer.valueOf(context.optString("port"));
  193. String mountName = context.optString("mountName");
  194. String userName = context.optString("userName");
  195. String passWord = context.optString("passWord");
  196. //TODO 熔断
  197. if(!"0".equals(bindCode)){
  198. initGnss();
  199. if (!EventBus.getDefault().isRegistered(this)) {
  200. EventBus.getDefault().register(this);
  201. }
  202. onBindClick();
  203. res.put("code","8");
  204. res.put("msg","服务已断开,正在重启,请稍后");
  205. return new ModuleResult(res);
  206. }
  207. if(!"0".equals(connectCode)) {
  208. ReceiverConnectProxy.getInstance().connByBluetooth(rtkName);
  209. res.put("code","9");
  210. res.put("msg","连接已断开,正在重启,请稍后");
  211. return new ModuleResult(res);
  212. }
  213. if(!"0".equals(logCorsCod)) {
  214. DiffConnectManager.loginCors(this.context(), ip, port, mountName, userName, passWord);
  215. }
  216. //TODO rtk连接比cors连接优先级要高
  217. if(rtkName!=null&&rtkName.length()>0){
  218. if(!rtkName.equals(ramRtkName)){
  219. //TODO 说明RTK 更换名称了 , 断开原连接再重新发送连接
  220. ReceiverConnectProxy.getInstance().disConnect();
  221. DiffConnectManager.loginOutCors(this.context());
  222. connectCode = "1";
  223. logCorsCod = "1";
  224. res = startSendMessage(context);
  225. }
  226. }else{
  227. //TODO 说明RTK 没传, 就断开连接
  228. ReceiverConnectProxy.getInstance().disConnect();
  229. DiffConnectManager.loginOutCors(this.context());
  230. connectCode = "1";
  231. logCorsCod = "1";
  232. res.put("code","4");
  233. res.put("msg","配对设备参数不存在");
  234. }
  235. //TODO cors更换
  236. if((ip!=null&&!ip.equals(ramIp))||(port!=null&&!port.equals(ramPort))
  237. ||(mountName!=null&&!mountName.equals(ramMountName))
  238. ||(userName!=null&&!userName.equals(ramCorsUserName))
  239. ||(passWord!=null&&!passWord.equals(ramCorsPassword))){
  240. //TODO 有一个条件不一致就要重连 cors
  241. DiffConnectManager.loginOutCors(this.context());
  242. if(ip!=null&&ip.length()>0&&
  243. port!=null&&
  244. mountName!=null&&mountName.length()>0&&
  245. userName!=null&&userName.length()>0&&
  246. passWord!=null&&passWord.length()>0){
  247. //TODO 重连必须满足以上条件
  248. DiffConnectManager.loginCors(this.context(),ip,port,mountName,userName,passWord);
  249. ramIp = ip;
  250. ramPort = port;
  251. ramMountName = mountName;
  252. ramCorsUserName = userName;
  253. ramCorsPassword = passWord;
  254. }
  255. }
  256. }catch (Exception ex){
  257. Log.i(TAG,ex.getLocalizedMessage());
  258. }
  259. return new ModuleResult(res);
  260. }
  261. private static final int REQUEST_PERMISSION = 0X01;
  262. private final static String[] PERMISSIONS = new String[]{
  263. Manifest.permission.ACCESS_COARSE_LOCATION,
  264. Manifest.permission.ACCESS_FINE_LOCATION,
  265. // Manifest.permission.READ_PHONE_STATE,
  266. Manifest.permission.READ_EXTERNAL_STORAGE,
  267. Manifest.permission.WRITE_EXTERNAL_STORAGE
  268. };
  269. public void initGnss(){
  270. initGnssServer();
  271. GnssToolApp.getInstance().init(SdcardUtils.getAppFolder());
  272. }
  273. private void initGnssServer() {
  274. GnssToolApp.getInstance().initContext(this.context());
  275. GnssToolApp.getInstance().setLocalBroadcast(true);
  276. }
  277. //TODO Lx 开启GisActivity
  278. public ModuleResult jsmethod_startGisActivity_sync(UZModuleContext moduleContext){
  279. if (checkPermissionEnable(PERMISSIONS)) {
  280. // Intent intent = new Intent(context(), GisActivity.class);
  281. // intent.putExtra("appParam", moduleContext.optString("appParam"));
  282. // startActivity(intent);
  283. } else {
  284. ActivityCompat.requestPermissions(this.activity(), PERMISSIONS, REQUEST_PERMISSION);
  285. }
  286. return new ModuleResult();
  287. }
  288. private boolean checkPermissionEnable(String[] permissions) {
  289. boolean isOk = true;
  290. for (String permission : permissions) {
  291. if (ActivityCompat.checkSelfPermission(this.context(), permission) == PackageManager.PERMISSION_DENIED) {
  292. isOk = false;
  293. break;
  294. }
  295. }
  296. return isOk;
  297. }
  298. //TODO Lx 人工触发初始化并绑定GISService
  299. public ModuleResult jsmethod_startGisService_sync(UZModuleContext moduleContext){
  300. JSONObject res = new JSONObject();
  301. String code = "1";
  302. String msg = "error";
  303. try{
  304. res.put("code",code);
  305. res.put("msg",msg);
  306. BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
  307. if (adapter == null) {
  308. res.put("code","2");
  309. res.put("msg","本机没有找到蓝牙硬件或驱动!");
  310. return new ModuleResult(res);
  311. } else {
  312. if (!adapter.isEnabled()) {
  313. //直接开启蓝牙
  314. adapter.enable();
  315. }
  316. }
  317. if (ContextCompat.checkSelfPermission(this.context(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  318. res.put("code","3");
  319. res.put("msg","定位授权:请授予APP位置访问权限,以便应用可检测外围设备");
  320. }
  321. if (checkPermissionEnable(PERMISSIONS)) {
  322. initGnss();
  323. if (!EventBus.getDefault().isRegistered(this)) {
  324. EventBus.getDefault().register(this);
  325. }
  326. onBindClick();
  327. //TODO 做连接状态字段bindCode的监听
  328. long time = System.currentTimeMillis();
  329. while (true){
  330. if (System.currentTimeMillis() - time < 1 * 1000) {//设置时间不超1秒
  331. //1秒内这个变量有变动,执行返回
  332. if(!"".equals(bindCode)) {
  333. if (bindCode.equals("0")) {
  334. code = "0";
  335. msg = "success";
  336. res.put("code", code);
  337. res.put("msg", msg);
  338. }
  339. return new ModuleResult(res);
  340. }
  341. } else {
  342. //TODO 说明超时
  343. msg = "绑定超时";
  344. res.put("msg",msg);
  345. break;
  346. }
  347. }
  348. } else {
  349. ActivityCompat.requestPermissions(this.activity(), PERMISSIONS, REQUEST_PERMISSION);
  350. }
  351. return new ModuleResult(res);
  352. }catch(Exception ex){
  353. code = "1";
  354. msg = "errorException";
  355. try{res.put("code",code);res.put("msg",msg);}catch(Exception e){}
  356. Log.e(TAG,ex.getLocalizedMessage());
  357. return new ModuleResult(res);
  358. }
  359. }
  360. public ModuleResult jsmethod_huaceRtkList_sync(UZModuleContext moduleContext){
  361. String code = "1";//0表示成功,1表示失败
  362. String msg = "error";//状态信息
  363. JSONObject res = new JSONObject();
  364. try{
  365. BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
  366. if (adapter == null) {
  367. res.put("code","2");
  368. res.put("msg","本机没有找到蓝牙硬件或驱动!");
  369. return new ModuleResult(res);
  370. } else {
  371. if (!adapter.isEnabled()) {
  372. //直接开启蓝牙
  373. adapter.enable();
  374. }
  375. }
  376. if (ContextCompat.checkSelfPermission(this.context(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  377. res.put("code","3");
  378. res.put("msg","定位授权:请授予APP位置访问权限,以便应用可检测外围设备");
  379. }
  380. // if (Build.VERSION.SDK_INT >= 28) {
  381. // //判断是否有管理外部存储的权限
  382. // //TODO 跳转到权限页,请求权限
  383. // Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  384. // intent.setData(Uri.fromParts("package", moduleContext.getContext().getPackageName(), null));
  385. // moduleContext.getContext().startActivity(intent);
  386. // }
  387. if (checkPermissionEnable(PERMISSIONS)) {
  388. //打开蓝牙
  389. if (!BlueUtils.isOpen()) {
  390. //Util.showOnUiThreadToast(this, "请打开蓝牙进行手机蓝牙配对!");
  391. // errorPromote(this, "温馨提示", "请在设置页面打开手机蓝牙配对连接!");
  392. res.put("code","4");
  393. res.put("msg","请在设置页面打开手机蓝牙配对连接!");
  394. return new ModuleResult(res);
  395. }
  396. List<String> arrBle = BlueUtils.getBluetoothDevice(BleStatusDefine.CONNECTED);
  397. if (arrBle != null && arrBle.size() > 0) {
  398. for (int i = arrBle.size() - 1; i >= 0; i--) {
  399. if (!arrBle.get(i).startsWith("GNSS"))
  400. arrBle.remove(i);
  401. }
  402. }
  403. if (arrBle == null || arrBle.size() <= 0) {
  404. // errorPromote(this, "温馨提示", "没有已配对连接的RTK蓝牙设备!");
  405. res.put("code","5");
  406. res.put("msg","没有已配对连接的RTK蓝牙设备!");
  407. return new ModuleResult(res);
  408. }
  409. res.put("code","0");
  410. res.put("msg","success");
  411. JSONArray jsonArray = new JSONArray();
  412. for (String rtkName:arrBle) {
  413. jsonArray.put(rtkName);
  414. }
  415. res.put("data",jsonArray);
  416. }else{
  417. res.put("code","6");
  418. res.put("msg","权限不足,请允许相关权限");
  419. ActivityCompat.requestPermissions(this.activity(), PERMISSIONS, REQUEST_PERMISSION);
  420. }
  421. return new ModuleResult(res);
  422. }catch(Exception ex){
  423. code = "1";
  424. msg = "errorException";
  425. try{res.put("code",code);res.put("msg",msg);}catch(Exception e){}
  426. Log.e(TAG,ex.getLocalizedMessage());
  427. return new ModuleResult(res);
  428. }
  429. }
  430. public ModuleResult jsmethod_sendConnect_sync(UZModuleContext moduleContext){
  431. String code = "1";//0表示成功,1表示失败
  432. String msg = "danger";//状态信息
  433. JSONObject res = new JSONObject();
  434. try {
  435. res.put("code",code);
  436. res.put("msg",msg);
  437. res.put("version","1.0.6");
  438. String rtkName = moduleContext.optString("rtkName");
  439. if(rtkName==null||"".equals(rtkName)){
  440. res.put("code","2");
  441. res.put("msg","配对设备参数不存在");
  442. return new ModuleResult(res);
  443. }
  444. //打开蓝牙
  445. if (!BlueUtils.isOpen()) {
  446. //Util.showOnUiThreadToast(this, "请打开蓝牙进行手机蓝牙配对!");
  447. // errorPromote(this, "温馨提示", "请在设置页面打开手机蓝牙配对连接!");
  448. res.put("code","3");
  449. res.put("msg","请在设置页面打开手机蓝牙配对连接!");
  450. return new ModuleResult(res);
  451. }
  452. List<String> arrBle = BlueUtils.getBluetoothDevice(BleStatusDefine.CONNECTED);
  453. if (arrBle != null && arrBle.size() > 0) {
  454. for (int i = arrBle.size() - 1; i >= 0; i--) {
  455. if (!arrBle.get(i).startsWith("GNSS"))
  456. arrBle.remove(i);
  457. }
  458. }
  459. if (arrBle == null || arrBle.size() <= 0) {
  460. // errorPromote(this, "温馨提示", "没有已配对连接的RTK蓝牙设备!");
  461. res.put("code","4");
  462. res.put("msg","没有已配对连接的RTK蓝牙设备!");
  463. return new ModuleResult(res);
  464. }
  465. if(!arrBle.contains(rtkName)){
  466. res.put("code","5");
  467. res.put("msg","您选择的设备"+rtkName+"未配对,请重新选择或在手机蓝牙设置页重新配对");
  468. return new ModuleResult(res);
  469. }
  470. if (!EventBus.getDefault().isRegistered(this)) {
  471. EventBus.getDefault().register(this);
  472. }
  473. ReceiverConnectProxy.getInstance().connByBluetooth(rtkName);
  474. GnssServerEnvironment.getInstance().setLog(new ILog(){
  475. @Override
  476. public void printException(@NonNull Exception e) {
  477. }
  478. @Override
  479. public void d(@NonNull String s) {
  480. Log.d("huaceDemo",s);
  481. }
  482. @Override
  483. public void e(@NonNull String s) {
  484. Log.e("huaceDemo",s);
  485. }
  486. @Override
  487. public void i(@NonNull String s) {
  488. Log.i("huaceDemo",s);
  489. }
  490. });
  491. //TODO 做连接状态字段connectCode的监听
  492. // long time = System.currentTimeMillis();
  493. // while (true){
  494. // if (System.currentTimeMillis() - time < 10 * 1000) {//设置时间不超5秒
  495. //5秒内这个变量有变动,执行返回
  496. if(!"".equals(connectCode)) {
  497. if (connectCode.equals("0")) {
  498. code = "0";
  499. msg = "success";
  500. res.put("code", code);
  501. res.put("msg", msg);
  502. }
  503. return new ModuleResult(res);
  504. }
  505. // } else {
  506. // //TODO 说明超时
  507. // msg = "连接超时";
  508. // res.put("msg",msg);
  509. // break;
  510. // }
  511. // }
  512. return new ModuleResult(res);
  513. }catch(Exception ex){
  514. code = "1";
  515. msg = "errorException";
  516. try{res.put("code",code);res.put("msg",msg);}catch(Exception e){}
  517. Log.e(TAG,ex.getLocalizedMessage());
  518. return new ModuleResult(res);
  519. }
  520. }
  521. public ModuleResult jsmethod_loginCors_sync(final UZModuleContext context){
  522. String code = "1";//0表示成功;1 表示失败
  523. String msg = "error";
  524. JSONObject res = new JSONObject();
  525. try{
  526. res.put("code",code);
  527. res.put("msg",msg);
  528. String ip = context.optString("ip");
  529. Integer port = Integer.valueOf(context.optString("port"));
  530. String mountName = context.optString("mountName");
  531. String userName = context.optString("userName");
  532. String passWord = context.optString("passWord");
  533. if(ip==null||"".equals(ip)||
  534. port==null||
  535. mountName==null||"".equals(mountName)||
  536. userName==null||"".equals(userName)||
  537. passWord==null||"".equals(passWord)){
  538. res.put("code","2");
  539. res.put("msg","传递参数不完整");
  540. return new ModuleResult(res);
  541. }
  542. if(!"0".equals(logCorsCod)){
  543. DiffConnectManager.loginCors(this.context(),ip,port,mountName,userName,passWord);
  544. }else{
  545. code = "0";
  546. msg = "success";
  547. }
  548. res.put("code",code);
  549. res.put("msg",msg);
  550. return new ModuleResult(res);
  551. }catch(Exception ex){
  552. code = "1";
  553. msg = "errorException";
  554. try{res.put("code",code);res.put("msg",msg);}catch(Exception e){}
  555. Log.e(TAG,ex.getLocalizedMessage());
  556. return new ModuleResult(res);
  557. }
  558. }
  559. //TODO 当前连接的rtk和 cors 账号内存信息
  560. private volatile static String ramRtkName = null;
  561. //TODO 当前登录cors相关
  562. private volatile static String ramIp = null;
  563. private volatile static Integer ramPort = null;
  564. private volatile static String ramMountName = null;
  565. private volatile static String ramCorsUserName = null;
  566. private volatile static String ramCorsPassword = null;
  567. //TODO Lx 高效率并简洁启动gisService服务并发送连接
  568. public ModuleResult jsmethod_startGisAndSend_sync(UZModuleContext moduleContext){
  569. JSONObject res = new JSONObject();
  570. String code = "1";
  571. String msg = "error";
  572. try{
  573. //TODO 启动服务相关判断
  574. res.put("code",code);
  575. res.put("msg",msg);
  576. res = startSendMessage(moduleContext);
  577. return new ModuleResult(res);
  578. }catch(Exception ex){
  579. code = "1";
  580. msg = "errorException";
  581. try{res.put("code",code);res.put("msg",msg);}catch(Exception e){}
  582. Log.e(TAG,ex.getLocalizedMessage());
  583. return new ModuleResult(res);
  584. }
  585. }
  586. //TODO 统一启动服务和发送连接命令
  587. private JSONObject startSendMessage(UZModuleContext moduleContext) throws JSONException {
  588. JSONObject res = new JSONObject();
  589. BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
  590. if (adapter == null) {
  591. res.put("code","2");
  592. res.put("msg","本机没有找到蓝牙硬件或驱动!");
  593. return res;
  594. } else {
  595. if (!adapter.isEnabled()) {
  596. //直接开启蓝牙
  597. adapter.enable();
  598. }
  599. }
  600. if (ContextCompat.checkSelfPermission(this.context(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  601. res.put("code","3");
  602. res.put("msg","定位授权:请授予APP位置访问权限,以便应用可检测外围设备");
  603. return res;
  604. }
  605. //TODO 连接相关判断
  606. String rtkName = moduleContext.optString("rtkName");
  607. if(rtkName==null||"".equals(rtkName)){
  608. res.put("code","4");
  609. res.put("msg","配对设备参数不存在");
  610. return res;
  611. }
  612. //打开蓝牙
  613. if (!BlueUtils.isOpen()) {
  614. //Util.showOnUiThreadToast(this, "请打开蓝牙进行手机蓝牙配对!");
  615. // errorPromote(this, "温馨提示", "请在设置页面打开手机蓝牙配对连接!");
  616. res.put("code","5");
  617. res.put("msg","请在设置页面打开手机蓝牙配对连接!");
  618. return res;
  619. }
  620. List<String> arrBle = BlueUtils.getBluetoothDevice(BleStatusDefine.CONNECTED);
  621. if (arrBle != null && arrBle.size() > 0) {
  622. for (int i = arrBle.size() - 1; i >= 0; i--) {
  623. if (!arrBle.get(i).startsWith("GNSS"))
  624. arrBle.remove(i);
  625. }
  626. }
  627. if (arrBle == null || arrBle.size() <= 0) {
  628. // errorPromote(this, "温馨提示", "没有已配对连接的RTK蓝牙设备!");
  629. res.put("code","6");
  630. res.put("msg","没有已配对连接的RTK蓝牙设备!");
  631. return res;
  632. }
  633. if(!arrBle.contains(rtkName)){
  634. res.put("code","7");
  635. res.put("msg","您选择的设备"+rtkName+"未配对,请重新选择或在手机蓝牙设置页重新配对");
  636. return res;
  637. }
  638. //TODO cors相关判断 , 全传就登录, 有一个没传就不登
  639. String ip = moduleContext.optString("ip");
  640. Integer port = Integer.valueOf(moduleContext.optString("port"));
  641. String mountName = moduleContext.optString("mountName");
  642. String userName = moduleContext.optString("userName");
  643. String passWord = moduleContext.optString("passWord");
  644. if (!EventBus.getDefault().isRegistered(this)) {
  645. EventBus.getDefault().register(this);
  646. }
  647. if (checkPermissionEnable(PERMISSIONS)) {
  648. //TODO ①先绑服务
  649. if(!"0".equals(bindCode)){
  650. initGnss();
  651. if (!EventBus.getDefault().isRegistered(this)) {
  652. EventBus.getDefault().register(this);
  653. }
  654. onBindClick();
  655. }
  656. Context thisContext = this.context();
  657. //TODO ②发送连接
  658. Timer timer = new Timer();
  659. timer.schedule(new TimerTask() {
  660. @Override
  661. public void run() {
  662. if(!"0".equals(connectCode)) {
  663. ReceiverConnectProxy.getInstance().connByBluetooth(rtkName);
  664. }else{
  665. //TODO rtk连接比cors连接优先级要高
  666. if(rtkName!=null&&rtkName.length()>0){
  667. if(!rtkName.equals(ramRtkName)){
  668. //TODO 说明RTK 更换名称了 , 断开原连接再重新发送连接
  669. ReceiverConnectProxy.getInstance().disConnect();
  670. DiffConnectManager.loginOutCors(thisContext);
  671. connectCode = "1";
  672. logCorsCod = "1";
  673. try {
  674. ReceiverConnectProxy.getInstance().connByBluetooth(rtkName);
  675. } catch (Exception e) {
  676. throw new RuntimeException(e);
  677. }
  678. }
  679. }else{
  680. //TODO 说明RTK 没传, 就断开连接
  681. ReceiverConnectProxy.getInstance().disConnect();
  682. DiffConnectManager.loginOutCors(thisContext);
  683. connectCode = "1";
  684. logCorsCod = "1";
  685. }
  686. }
  687. }
  688. },1000);
  689. //TODO ③登录cors
  690. if(ip!=null&&ip.length()>0&&
  691. port!=null&&
  692. mountName!=null&&mountName.length()>0&&
  693. userName!=null&&userName.length()>0&&
  694. passWord!=null&&passWord.length()>0){
  695. Timer timer2 = new Timer();
  696. Context corsContext = this.context();
  697. timer2.schedule(new TimerTask() {
  698. @Override
  699. public void run() {
  700. if(!"0".equals(logCorsCod)){
  701. DiffConnectManager.loginCors(corsContext,ip,port,mountName,userName,passWord);
  702. }else{
  703. //TODO cors更换
  704. if((ip!=null&&!ip.equals(ramIp))||(port!=null&&!port.equals(ramPort))
  705. ||(mountName!=null&&!mountName.equals(ramMountName))
  706. ||(userName!=null&&!userName.equals(ramCorsUserName))
  707. ||(passWord!=null&&!passWord.equals(ramCorsPassword))){
  708. //TODO 有一个条件不一致就要重连 cors
  709. DiffConnectManager.loginOutCors(thisContext);
  710. if(ip!=null&&ip.length()>0&&
  711. port!=null&&
  712. mountName!=null&&mountName.length()>0&&
  713. userName!=null&&userName.length()>0&&
  714. passWord!=null&&passWord.length()>0){
  715. //TODO 重连必须满足以上条件
  716. DiffConnectManager.loginCors(thisContext,ip,port,mountName,userName,passWord);
  717. ramIp = ip;
  718. ramPort = port;
  719. ramMountName = mountName;
  720. ramCorsUserName = userName;
  721. ramCorsPassword = passWord;
  722. }
  723. }
  724. }
  725. }
  726. },1500);
  727. }
  728. //static 内存赋值
  729. ramRtkName = rtkName;
  730. ramIp = ip;
  731. ramPort = port;
  732. ramMountName = mountName;
  733. ramCorsUserName = userName;
  734. ramCorsPassword = passWord;
  735. res.put("code","0");
  736. res.put("msg","success");
  737. return res;
  738. }else {
  739. ActivityCompat.requestPermissions(this.activity(), PERMISSIONS, REQUEST_PERMISSION);
  740. }
  741. return res;
  742. }
  743. //TODO Lx 销毁服务绑定
  744. public ModuleResult jsmethod_stopGisService_sync(final UZModuleContext context) {
  745. String code = "1";//0表示成功;1表示失败
  746. String msg = "";
  747. JSONObject res = new JSONObject();
  748. //解绑服务
  749. try {
  750. // GnssToolManager.getInstance().unBindService(this.context());
  751. onUnBindClick();
  752. code = "0";
  753. res.put("code",code);
  754. }catch (Exception e){
  755. Log.i(TAG,e.getLocalizedMessage());
  756. }
  757. return new ModuleResult(res);
  758. }
  759. //TODO Lx 断开Connect连接
  760. public ModuleResult jsmethod_stopBTConnect_sync(final UZModuleContext context) {
  761. String code = "1";//0表示成功;1表示失败
  762. String msg = "";
  763. JSONObject res = new JSONObject();
  764. //解绑服务
  765. try {
  766. // GnssToolManager.getInstance().unBindService(this.context());
  767. ReceiverConnectProxy.getInstance().disConnect();
  768. //TODO 无异常
  769. connectCode = "1";
  770. code = "0";
  771. res.put("code",code);
  772. }catch (Exception e){
  773. Log.i(TAG,e.getLocalizedMessage());
  774. }
  775. return new ModuleResult(res);
  776. }
  777. //TODO Lx 断开Cors连接
  778. public ModuleResult jsmethod_stopGorsConnect_sync(final UZModuleContext context) {
  779. String code = "1";//0表示成功;1表示失败
  780. String msg = "";
  781. JSONObject res = new JSONObject();
  782. //解绑服务
  783. try {
  784. // GnssToolManager.getInstance().unBindService(this.context());
  785. DiffConnectManager.loginOutCors(this.context());
  786. //TODO 无异常
  787. logCorsCod = "1";
  788. code = "0";
  789. res.put("code",code);
  790. }catch (Exception e){
  791. Log.i(TAG,e.getLocalizedMessage());
  792. }
  793. return new ModuleResult(res);
  794. }
  795. private void onBindClick() {
  796. GnssServiceManager.getInstance().bindService(this.context());
  797. }
  798. /***
  799. * 解绑GnssServer服务
  800. */
  801. private void onUnBindClick() {
  802. GnssServiceManager.getInstance().unBindService(this.context());
  803. }
  804. @Subscribe(threadMode = ThreadMode.MAIN,sticky =true)
  805. public void onEventMainThread(GnssServiceStatusEvent event) {
  806. switch (event.getGnssServiceStatus()) {
  807. case GnssServiceStatusEvent.SERVICE_BIND_SUCCEED:
  808. Log.i(TAG,"已绑定");
  809. bindCode = "0";
  810. break;
  811. case GnssServiceStatusEvent.SERVICE_UNBIND:
  812. Log.i(TAG,"未绑定");
  813. bindCode = "1";
  814. break;
  815. default:
  816. }
  817. }
  818. SimpleDateFormat format = new SimpleDateFormat("MM-dd-HH-mm-ss", Locale.getDefault());
  819. /***
  820. * 把收到的Gnss数据展示到页面上
  821. *
  822. * @param gnssinfo gnssinfo
  823. */
  824. @Subscribe(threadMode = ThreadMode.MAIN,sticky =true)
  825. public void onEventMainThread(GnssInfo gnssinfo) {
  826. connectCode = "0";
  827. Log.i(TAG,String.valueOf(gnssinfo.latitude));
  828. Log.i(TAG,String.valueOf(gnssinfo.longitude));
  829. Log.i(TAG,String.valueOf(gnssinfo.altitude));
  830. Log.i(TAG,"" + gnssinfo.staUseCount + "/" + gnssinfo.staCount);
  831. postType = String.valueOf(gnssinfo.posType);
  832. Log.i(TAG,String.valueOf(gnssinfo.posType));
  833. if (gnssinfo.posType!=6) {
  834. if("0".equals(logCorsCod)){
  835. if(gnssinfo.posType!=4) {
  836. wgslat = String.valueOf(gnssinfo.latitude);
  837. wgslng = String.valueOf(gnssinfo.longitude);
  838. wgsblh = String.valueOf(gnssinfo.altitude);
  839. }
  840. }else {
  841. wgslat = String.valueOf(gnssinfo.latitude);
  842. wgslng = String.valueOf(gnssinfo.longitude);
  843. wgsblh = String.valueOf(gnssinfo.altitude);
  844. }
  845. }
  846. if (gnssinfo.time != null && !gnssinfo.time.isEmpty()) {
  847. //format在使用之前必须加TimeZone.getDefault();
  848. long longtime = TimeZone.getDefault().getRawOffset() + Long.parseLong(gnssinfo.time);
  849. format.setTimeZone(TimeZone.getDefault());
  850. String time = format.format(new Date(longtime));
  851. Log.i(TAG,time);
  852. }
  853. }
  854. @Subscribe(threadMode = ThreadMode.MAIN,sticky =true)
  855. public void onEventMainThread(ReceiverConnectStatusEvent event) {
  856. Log.i(TAG,event.getStatus().name());
  857. }
  858. @Subscribe(threadMode = ThreadMode.MAIN,sticky =true)
  859. public void onEventMainThread(GnssConnectStatusEvent event) {
  860. switch (event.getGnssConnectStatus()) {
  861. case GnssConnectStatusEvent.RECEIVER_DISCONNECT_CORS_DISCONNECT:
  862. connectCode = "1";
  863. logCorsCod = "1";
  864. Log.i(TAG,"已断开");
  865. break;
  866. case GnssConnectStatusEvent.RECEIVER_CONNECT_CORS_DISCONNECT:
  867. connectCode = "0";
  868. Log.i(TAG,"已连接");
  869. break;
  870. case GnssConnectStatusEvent.RECEIVER_CONNECT_CORS_CONNECT:
  871. logCorsCod = "0";
  872. Log.i(TAG,"已登录");
  873. // if (progressDialog != null && progressDialog.isShowing()) {
  874. // progressDialog.dismiss();
  875. // progressDialog = null;
  876. // Toast.makeText(MainActivity.this, "登录Cors成功!", Toast.LENGTH_LONG).show();
  877. // }
  878. break;
  879. case GnssConnectStatusEvent.ERROR_TEN_SECOND_NO_DATA:
  880. default:
  881. break;
  882. }
  883. }
  884. @Subscribe(threadMode = ThreadMode.MAIN,sticky =true)
  885. public void onEventMainThread(WorkWay way) {
  886. Log.i(TAG,way.enumWorkWay.name());
  887. }
  888. @Subscribe(threadMode = ThreadMode.MAIN,sticky =true)
  889. public void onEventMainThread(ReceiverInfo info) {
  890. Log.i(TAG,info.getSn());
  891. }
  892. /**
  893. * TODO 此处以下为demo代码 无意义
  894. */
  895. /**
  896. * <strong>函数</strong><br><br>
  897. * 该函数映射至Javascript中moduleDemo对象的showAlert函数<br><br>
  898. * <strong>JS Example:</strong><br>
  899. * moduleDemo.showAlert(argument);
  900. *
  901. * @param moduleContext (Required)
  902. */
  903. public void jsmethod_showAlert(final UZModuleContext moduleContext){
  904. if(null != mAlert){
  905. return;
  906. }
  907. String showMsg = moduleContext.optString("msg");
  908. mAlert = new AlertDialog.Builder(context());
  909. mAlert.setTitle("这是标题");
  910. mAlert.setMessage(showMsg);
  911. mAlert.setCancelable(false);
  912. mAlert.setPositiveButton("确定", new OnClickListener() {
  913. @Override
  914. public void onClick(DialogInterface dialog, int which) {
  915. dialog.dismiss();
  916. mAlert = null;
  917. JSONObject ret = new JSONObject();
  918. try {
  919. ret.put("buttonIndex", 1);
  920. } catch (JSONException e) {
  921. e.printStackTrace();
  922. }
  923. moduleContext.success(ret, true);
  924. }
  925. });
  926. mAlert.show();
  927. }
  928. /**
  929. * <strong>函数</strong><br><br>
  930. * 该函数映射至Javascript中moduleDemo对象的startActivity函数<br><br>
  931. * <strong>JS Example:</strong><br>
  932. * moduleDemo.startActivity(argument);
  933. *
  934. * @param moduleContext (Required)
  935. */
  936. public void jsmethod_startActivity(UZModuleContext moduleContext){
  937. // Intent intent = new Intent(context(), DemoActivity.class);
  938. // intent.putExtra("appParam", moduleContext.optString("appParam"));
  939. // startActivity(intent);
  940. }
  941. /**
  942. * <strong>函数</strong><br><br>
  943. * 该函数映射至Javascript中moduleDemo对象的startActivityForResult函数<br><br>
  944. * <strong>JS Example:</strong><br>
  945. * moduleDemo.startActivityForResult(argument);
  946. *
  947. * @param moduleContext (Required)
  948. */
  949. public void jsmethod_startActivityForResult(UZModuleContext moduleContext){
  950. mJsCallback = moduleContext;
  951. // Intent intent = new Intent(context(), DemoActivity.class);
  952. // intent.putExtra("appParam", moduleContext.optString("appParam"));
  953. // intent.putExtra("needResult", true);
  954. // startActivityForResult(intent, ACTIVITY_REQUEST_CODE_A);
  955. }
  956. /**
  957. * <strong>函数</strong><br><br>
  958. * 该函数映射至Javascript中moduleDemo对象的vibrate函数<br><br>
  959. * <strong>JS Example:</strong><br>
  960. * moduleDemo.vibrate(argument);
  961. *
  962. * @param moduleContext (Required)
  963. */
  964. public void jsmethod_vibrate(UZModuleContext moduleContext){
  965. try {
  966. if (null == mVibrator) {
  967. mVibrator = (Vibrator) context().getSystemService(Context.VIBRATOR_SERVICE);
  968. }
  969. mVibrator.vibrate(moduleContext.optLong("milliseconds"));
  970. } catch (SecurityException e) {
  971. Toast.makeText(context(), "no vibrate permisson declare", Toast.LENGTH_SHORT).show();
  972. }
  973. }
  974. /**
  975. * <strong>函数</strong><br><br>
  976. * 该函数映射至Javascript中moduleDemo对象的stopVibrate函数<br><br>
  977. * <strong>JS Example:</strong><br>
  978. * moduleDemo.stopVibrate(argument);
  979. *
  980. * @param moduleContext (Required)
  981. */
  982. public void jsmethod_stopVibrate(UZModuleContext moduleContext){
  983. if (null != mVibrator) {
  984. try {
  985. mVibrator.cancel();
  986. mVibrator = null;
  987. } catch (SecurityException e) {
  988. e.printStackTrace();
  989. }
  990. }
  991. }
  992. /**
  993. * <strong>函数</strong><br><br>
  994. * 该函数映射至Javascript中moduleDemo对象的addView函数<br><br>
  995. * <strong>JS Example:</strong><br>
  996. * moduleDemo.addView(argument);
  997. *
  998. * @param moduleContext (Required)
  999. */
  1000. public void jsmethod_addView(UZModuleContext moduleContext){
  1001. int x = moduleContext.optInt("x");
  1002. int y = moduleContext.optInt("y");
  1003. int w = moduleContext.optInt("w");
  1004. int h = moduleContext.optInt("h");
  1005. if(w == 0){
  1006. w = ViewGroup.LayoutParams.MATCH_PARENT;
  1007. }
  1008. if(h == 0){
  1009. h = ViewGroup.LayoutParams.MATCH_PARENT;
  1010. }
  1011. if(null == mMyTextView){
  1012. mMyTextView = new MyTextView(context());
  1013. }
  1014. int FROM_TYPE = Animation.RELATIVE_TO_PARENT;
  1015. Animation anim = new TranslateAnimation(FROM_TYPE, 1.0f, FROM_TYPE, 0.0f, FROM_TYPE, 0.0f, FROM_TYPE, 0.0f);
  1016. anim.setDuration(500);
  1017. mMyTextView.setAnimation(anim);
  1018. RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(w, h);
  1019. rlp.leftMargin = x;
  1020. rlp.topMargin = y;
  1021. insertViewToCurWindow(mMyTextView, rlp);
  1022. }
  1023. /**
  1024. * <strong>函数</strong><br><br>
  1025. * 该函数映射至Javascript中moduleDemo对象的removeView函数<br><br>
  1026. * <strong>JS Example:</strong><br>
  1027. * moduleDemo.removeView(argument);
  1028. *
  1029. * @param moduleContext (Required)
  1030. */
  1031. public void jsmethod_removeView(UZModuleContext moduleContext){
  1032. if(null != mMyTextView){
  1033. removeViewFromCurWindow(mMyTextView);
  1034. }
  1035. }
  1036. @Override
  1037. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  1038. if(resultCode == Activity.RESULT_OK && requestCode == ACTIVITY_REQUEST_CODE_A){
  1039. String result = data.getStringExtra("result");
  1040. if(null != result && null != mJsCallback){
  1041. try {
  1042. JSONObject ret = new JSONObject(result);
  1043. mJsCallback.success(ret, true);
  1044. mJsCallback = null;
  1045. } catch (JSONException e) {
  1046. e.printStackTrace();
  1047. }
  1048. }
  1049. }
  1050. }
  1051. @Override
  1052. protected void onClean() {
  1053. if(null != mAlert){
  1054. mAlert = null;
  1055. }
  1056. if(null != mJsCallback){
  1057. mJsCallback = null;
  1058. }
  1059. }
  1060. class MyTextView extends TextView{
  1061. public MyTextView(Context context) {
  1062. super(context);
  1063. setBackgroundColor(0xFFF0CFD0);
  1064. setText("我是自定义View");
  1065. setTextColor(0xFF000000);
  1066. setGravity(Gravity.CENTER);
  1067. }
  1068. }
  1069. }