package com.project.survey.ui; import android.Manifest; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationManager; import android.os.Build; import android.provider.Settings; import android.view.View; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleEventObserver; import androidx.lifecycle.LifecycleOwner; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; import com.bingce.AppChannel; import com.bingce.BaseApp; import com.bingce.coordlib.model.Blh; import com.bingce.coordlib.util.CoordUtil; import com.bingce.data.cache.CachedCurrentCoordinateSystemKt; import com.bingce.data.sync.GlobalFlowCenter; import com.bingce.data.sync.utils.LeanCloudUserLoginStateUtils; import com.bingce.device.Device; import com.bingce.device.enums.ConnectTypeEnum; import com.bingce.device.enums.DeviceTypeEnum; import com.bingce.device.service.comm.ble.BleService; import com.bingce.device.service.comm.emulator.EmulatorService; import com.bingce.device.service.comm.localgps.LocationService; import com.bingce.device.service.comm.localgps.NativePositioningService; import com.bingce.device.service.comm.messenger.QxwzMessengerService; import com.bingce.device.service.comm.otg.OTGCommService; import com.bingce.device.service.comm.socket.TsSocketService; import com.bingce.device.service.comm.spp.BTService; import com.bingce.device.service.ntrip_sdk.CmccSdkService; import com.bingce.device.service.ntrip_sdk.LuoWangSdkService; import com.bingce.device.service.ntrip_sdk.NtripService; import com.bingce.device.service.ntrip_sdk.QxwzSdkService; import com.bingce.device.service.ntrip_sdk.SixentsSdkService; import com.bingce.device.ui.ConnectRtkActivity; import com.bingce.device.ui.ConnectTSActivity; import com.bingce.device.ui.dialog.DialogUtil; import com.bingce.device.ui.utils.DeviceUtil; import com.bingce.device.ui.widget.BCProgressDialog; import com.bingce.rtk.command.RTK; import com.bingce.rtk.command.qxwz.QxwzRTK; import com.bingce.rtk.enums.DataLinkModeEnum; import com.bingce.rtk.enums.NetworkModeEnum; import com.bingce.rtk.enums.NtripCorsProviderEnum; import com.bingce.rtk.event.RtkCheckBaseMoveEvent; import com.bingce.rtk.event.RtkCmdAnswerEvent; import com.bingce.rtk.event.RtkCmdQueueSendEvent; import com.bingce.rtk.event.RtkCmdUiEvent; import com.bingce.rtk.event.RtkReceivedSerialNumberEvent; import com.bingce.rtk.event.RtkSpeechEvent; import com.bingce.rtk.event.RtkStartCmccServiceEvent; import com.bingce.rtk.event.RtkStartLuoWangServiceEvent; import com.bingce.rtk.event.RtkStartNtripServiceEvent; import com.bingce.rtk.event.RtkStartQxwzSdkServiceEvent; import com.bingce.rtk.event.RtkStartSixentsServiceEvent; import com.bingce.rtk.event.RtkStopNtripSDKEvent; import com.bingce.rtk.gnss.Gnss; import com.bingce.rtk.model.GnssPosition; import com.bingce.rtk.util.GnssUtil; import com.bingce.totalstation.TotalStation; import com.bingce.totalstation.TsConfig; import com.bingce.totalstation.enums.SetupStationMethodEnum; import com.bingce.totalstation.event.TsUpdateStatusEvent; import com.bingce.utils.AppCompatActivityProviderUtils; import com.bingce.utils.AppUtil; import com.bingce.utils.IProvider; import com.bingce.utils.LCDeviceUtil; import com.bingce.utils.RomUtil; import com.bingce.utils.SdkUtils; import com.bingce.utils.SoundPoolUtil; import com.bingce.utils.ThreadPoolUtil; import com.bingce.utils.Util; import com.bingce.utils.ValidateUtil; import com.bingce.utils.VipManager; import com.hjq.permissions.OnPermissionCallback; import com.hjq.permissions.OnPermissionPageCallback; import com.hjq.permissions.Permission; import com.hjq.permissions.XXPermissions; import com.project.survey.App; import com.project.survey.R; import com.project.survey.ui.instrument.basestationtranslation.RtkBaseCorrectActivity; import net.tatans.tensorflowtts.tts.TtsManager; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.List; import alibaba.fastjson.JSON; import alibaba.fastjson.JSONObject; import blankj.utilcode.util.ActivityUtils; import blankj.utilcode.util.ServiceUtils; import blankj.utilcode.util.StringUtils; import blankj.utilcode.util.ToastUtils; import blankj.utilcode.util.Utils; import cn.leancloud.LCUser; import cn.leancloud.types.LCGeoPoint; import cn.liuyanbing.surveyor.model.util.CUtil; public class MainActivityUtils extends AppCompatActivityProviderUtils { private boolean gnssServerReady = false; private MaterialDialog cenLngUnusualDialog; private MaterialDialog langDialog, unbindDeviceDialog; private BCProgressDialog deviceConnectingProgressDialog; private final CachedCurrentCoordinateSystemKt cachedCoordinateSystemKt; public MainActivityUtils(AppCompatActivity activity, IProvider activityIProvider) { super(activityIProvider); cachedCoordinateSystemKt = new CachedCurrentCoordinateSystemKt(activity); activity.getLifecycle().addObserver(new LifecycleEventObserver() { @Override public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) { switch (event) { case ON_CREATE: EventBus.getDefault().register(MainActivityUtils.this); SoundPoolUtil.getInstance().initHintSing(activity, SoundPoolUtil.TEST, R.raw.savedone); // SoundPoolUtil.getInstance().initHintSing(activity, SoundPoolUtil.SEPTENTRIO_FILL, R.raw.septentrio_fill); // SoundPoolUtil.getInstance().initHintSing(activity, SoundPoolUtil.SEPTENTRIO_CUT, R.raw.septentrio_cut); SoundPoolUtil.getInstance().initHintSing(activity, SoundPoolUtil.ALPHA_STAKING, R.raw.alphastaking); SoundPoolUtil.getInstance().initHintSing(activity, SoundPoolUtil.ALPHA_RECORDING, R.raw.alpharecording); break; case ON_DESTROY: EventBus.getDefault().unregister(MainActivityUtils.this); SoundPoolUtil.getInstance().onDestroy(); break; case ON_RESUME: checkGnssServerReady(); break; } } }); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(RtkSpeechEvent event) { if (!StringUtils.isEmpty(event.getText())) TtsManager.getInstance().speak(event.getText()); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(RtkCheckBaseMoveEvent event) { //检查是否需要进行基站平移校准 String needBaseCorrect = GnssUtil.checkNeedBaseCorrect(); if (GnssPosition.getInstance().isBaseMoveRemind() && (event.isConfirmMoved() || needBaseCorrect != null)) { new MaterialDialog.Builder(/*this*/context()).title(R.string.hint) .content("检测到基站位置发生变化,为了保证精度可靠,请选择基站平移校准" + (event.isConfirmMoved() ? "" : (needBaseCorrect == null ? "" : "\n(" + needBaseCorrect + ")"))) .positiveText(R.string.rtk_base_correct) .negativeText("忽略") .neutralText("本次不再提醒") .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { Intent intent = new Intent(Utils.getApp(), RtkBaseCorrectActivity.class); startActivity(intent); } }).onNeutral(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { GnssPosition.getInstance().setBaseMoveRemind(false); } }).show(); } } public void checkRtkLocation() { if (Device.getInstance().deviceType != DeviceTypeEnum.DEVICE_TYPE_RTK) return; if (((BaseApp) Utils.getApp()).avGeoPoint == null && GnssPosition.getInstance().validate) { Blh blh = GnssPosition.getInstance().getWgs84Blh(); if (!CUtil.isEqual(blh.getLatitude(), 0) && !CUtil.isEqual(blh.getLongitude(), 0)) { ((BaseApp) Utils.getApp()).avGeoPoint = new LCGeoPoint(blh.getLatitude(), blh.getLongitude()); ((BaseApp) Utils.getApp()).lastRTKLocation = ((BaseApp) Utils.getApp()).avGeoPoint.getLatitude() + "," + ((BaseApp) Utils.getApp()).avGeoPoint.getLongitude(); Util.putPreference("lastRTKLocation", ((BaseApp) Utils.getApp()).lastRTKLocation); } } if (GnssPosition.getInstance().getPosType() != GnssPosition.POS_TYPE_NONE//初始化时跳过 && cachedCoordinateSystemKt.isDataReady() && Device.getInstance().remindCentLngUnusual//已经提示过就不再提示 && Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_RTK//RTK时才提示 && Math.abs(GnssPosition.getInstance().getWgs84Blh().getLongitude() - cachedCoordinateSystemKt.coordinateSystem().centLng) > 3.0d) { if (cenLngUnusualDialog == null || !cenLngUnusualDialog.isShowing()) { if (ActivityUtils.getTopActivity() != null && !ActivityUtils.getTopActivity().isFinishing()) cenLngUnusualDialog = new MaterialDialog.Builder(ActivityUtils.getTopActivity()).title(R.string.hint).content(getString(R.string.center_longitude_unusual) + getString(R.string.current_center_longitude) + ":" + CoordUtil.radianToDmsDoubleString(Math.toRadians(cachedCoordinateSystemKt.coordinateSystem().centLng), 6, false)).positiveText(R.string.confirm).onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { Device.getInstance().remindCentLngUnusual = false; Util.putPreference("remindCentLngUnusual", Device.getInstance().remindCentLngUnusual); } }).show(); } } } /** * 连接设备成功后,启动相关服务,因为Ntrip与SN无关,可以在此执行,与SN相关的服务在RtkReceivedSerialNumberEvent事件后执行 */ public void onDeviceConnectSuccess() { if (deviceConnectingProgressDialog != null && deviceConnectingProgressDialog.isShowing()) { deviceConnectingProgressDialog.dismiss(); deviceConnectingProgressDialog = null; } if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_RTK) { if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_SPP || Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_BLE) { if (Gnss.getInstance().getDevice().getCurDataLink() == DataLinkModeEnum.PHONE) { if (!Device.getInstance().isRtkInitDone()) { Device.getInstance().rtkRunnableStart(); Device.getInstance().rtkInit(); } if (Gnss.getInstance().getNetwork().getMode() == NetworkModeEnum.NTRIP) {//因为SDK与deviceID相关,所以在获取序列号后执行,而Ntrip启动是在连接成功后就可以 EventBus.getDefault().post(new RtkStartNtripServiceEvent()); ToastUtils.showShort(R.string.phone_network_diff_initialization); } } else { if (!Device.getInstance().isRtkInitDone()) { Device.getInstance().rtkRunnableStart(); Device.getInstance().rtkInit(); } } } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_QXBT) { if (!Device.getInstance().isRtkInitDone()) { Device.getInstance().rtkRunnableStart(); Device.getInstance().rtkInit(); } } else { //手机定位或演示模式 } } else { TotalStation.getInstance().runnableStart(); TotalStation.getInstance().init(); // if (((App) Utils.getApp()).isShowTsSetupStationOption) chooseSetupStationType(); } //记录用户联机时手机定位的大概位置 if (ActivityCompat.checkSelfPermission(/*this*/context(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { LocationManager mLocationManager = ((LocationManager) context().getSystemService(Context.LOCATION_SERVICE)); if (mLocationManager != null) { List providers = mLocationManager.getProviders(true); if (providers.contains(LocationManager.GPS_PROVIDER)) { Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { ((BaseApp) Utils.getApp()).lastPhoneLocation = location.getLatitude() + "," + location.getLongitude(); Util.putPreference("lastPhoneLocation", ((BaseApp) Utils.getApp()).lastPhoneLocation); } } } } } /** * 获取SN号后启动与SN相关的服务 * * @param event */ @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(RtkReceivedSerialNumberEvent event) {//因为SDK与deviceID相关,所以在此执行,而Ntrip启动是在连接成功后就可以 if (Gnss.getInstance().getDevice().getCurDataLink() == DataLinkModeEnum.PHONE) { if (Gnss.getInstance().getNetwork().getMode() == NetworkModeEnum.QXWZ_SDK) { EventBus.getDefault().post(new RtkStartQxwzSdkServiceEvent()); ToastUtils.showShort(R.string.qxwz_service_initialization); } else if (Gnss.getInstance().getNetwork().getMode() == NetworkModeEnum.CMCC_SDK) { EventBus.getDefault().post(new RtkStartCmccServiceEvent()); ToastUtils.showShort(R.string.cmcc_service_initialization); } else if (Gnss.getInstance().getNetwork().getMode() == NetworkModeEnum.SIXENTS_SDK) { EventBus.getDefault().post(new RtkStartSixentsServiceEvent()); ToastUtils.showShort(R.string.sixents_service_initialization); } else if (Gnss.getInstance().getNetwork().getMode() == NetworkModeEnum.LUOWANG_SDK) { EventBus.getDefault().post(new RtkStartLuoWangServiceEvent()); ToastUtils.showShort(R.string.luowang_service_initialization); } } } public void onDeviceConnectFailed() { if (deviceConnectingProgressDialog != null && deviceConnectingProgressDialog.isShowing()) { deviceConnectingProgressDialog.dismiss(); deviceConnectingProgressDialog = null; ToastUtils.showShort(R.string.device_connect_failed); } } public void onDeviceConnectLost() { ToastUtils.showShort(R.string.device_connect_lost); } public void onRequestConnect() { if (deviceConnectingProgressDialog == null || !deviceConnectingProgressDialog.isShowing()) { deviceConnectingProgressDialog = new BCProgressDialog.Builder(ActivityUtils.getTopActivity()).title(R.string.connect_device).build(); deviceConnectingProgressDialog.show(); } } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(TsUpdateStatusEvent event) { // Fragment currentFragment = MainFragmentUtil.getCurrentFragment(/*this*/activity(), MainActivity.mainContainer); // if (currentFragment instanceof TcsAutoScan2DxfFragment) { // ((TcsAutoScan2DxfFragment) currentFragment).updateStatus(event.getStatus()); // } } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(RtkStartNtripServiceEvent event) { // CorsUseLogManager.getInstance().logEvent("MainActivity-onMessageEvent-StartNtripServiceEvent"); ServiceUtils.startService(NtripService.class); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(RtkStartQxwzSdkServiceEvent event) { // CorsUseLogManager.getInstance().logEvent("MainActivity-onMessageEvent-StartQxwzServiceEvent"); ServiceUtils.startService(QxwzSdkService.class); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(RtkStartSixentsServiceEvent event) { // CorsUseLogManager.getInstance().logEvent("MainActivity-onMessageEvent-StartSixentsServiceEvent"); ServiceUtils.startService(SixentsSdkService.class); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(RtkStartCmccServiceEvent event) { // CorsUseLogManager.getInstance().logEvent("MainActivity-onMessageEvent-StartCmccServiceEvent"); ServiceUtils.startService(CmccSdkService.class); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(RtkStartLuoWangServiceEvent event) { // CorsUseLogManager.getInstance().logEvent("MainActivity-onMessageEvent-StartLuoWangServiceEvent"); ServiceUtils.startService(LuoWangSdkService.class); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(RtkStopNtripSDKEvent event) { ServiceUtils.stopService(NtripService.class); ServiceUtils.stopService(QxwzSdkService.class); ServiceUtils.stopService(CmccSdkService.class); ServiceUtils.stopService(LuoWangSdkService.class); ServiceUtils.stopService(SixentsSdkService.class); Device.getInstance().oneKeyFixValid = false; } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(RtkCmdAnswerEvent event) { Device.getInstance().rtkProcessCmdAnswer(event.getSentence()); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(RtkCmdQueueSendEvent event) { Device.getInstance().rtkSendCommand(event.getQueue()); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(RtkCmdUiEvent event) { if (event.getContent() == null) { Device.getInstance().rtkUpdateUiMessage(event.getWhat()); } else { Device.getInstance().rtkUpdateUiMessage(event.getWhat(), event.getContent()); } } // /** // * 选择设站模式 // */ // private void chooseSetupStationType() { // if (((App) Utils.getApp()).lastTsSetupStationType < 0 || ((App) Utils.getApp()).lastTsSetupStationType > 4) // ((App) Utils.getApp()).lastTsSetupStationType = 0; // new MaterialDialog.Builder(ActivityUtils.getTopActivity()) // .title(R.string.total_station_setup_type) // .items(R.array.setup_station_type_with_current) // .itemsCallbackSingleChoice(((App) Utils.getApp()).lastTsSetupStationType, new MaterialDialog.ListCallbackSingleChoice() { // @Override // public boolean onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) { // switch (which) { // case 0: // startActivity(new Intent(Utils.getApp(), SetupStationCurrentActivity.class)); // break; // case 1: // TsConfig.getInstance().setSetupStationMethod(SetupStationMethodEnum.TS_DONE_SKIP); // ToastUtils.showShort(R.string.apply_success); // break; // case 2: // TsConfig.getInstance().setSetupStationMethod(SetupStationMethodEnum.TS_DONE_INPUT_INTO_APP); // startActivity(new Intent(Utils.getApp(), SetupStationInputActivity.class)); // break; // case 3: // TsConfig.getInstance().setSetupStationMethod(SetupStationMethodEnum.APP_SETUP_KNOWN_BACK_SIGHT); // startActivity(new Intent(Utils.getApp(), SetupStationKnownBackSightActivity.class)); // break; // case 4: // TsConfig.getInstance().setSetupStationMethod(SetupStationMethodEnum.APP_SETUP_RESECTION); // startActivity(new Intent(Utils.getApp(), SetupStationResectionActivity.class)); // break; // } // TsConfig.getInstance().save(); // ((App) Utils.getApp()).lastTsSetupStationType = which; // Util.putPreference("lastTsSetupStationType", ((App) Utils.getApp()).lastTsSetupStationType); // return false; // } // }).positiveText(R.string.next) // .neutralText(R.string.not_show_again) // .onNeutral(new MaterialDialog.SingleButtonCallback() { // @Override // public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { // Util.putPreference("key_is_show_ts_setup_station_option", false); // ((App) Utils.getApp()).isShowTsSetupStationOption = false; // new MaterialDialog.Builder(ActivityUtils.getTopActivity()) // .content(R.string.set_show_ts_setup_station_option_in_setting) // .positiveText(R.string.i_know) // .show(); // } // }).show(); // } /** * 连接蓝牙先请求打开定位权限 */ public void requestBluetoothPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && XXPermissions.isGranted(ActivityUtils.getTopActivity(), Permission.BLUETOOTH_CONNECT)) {//S及以后不需要位置权限 checkConnectLast(); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {//S及以后不需要位置权限,此时只需请求connect权限 if (XXPermissions.isGranted(ActivityUtils.getTopActivity(), Permission.BLUETOOTH_CONNECT)) { checkConnectLast(); } else { new MaterialDialog.Builder(ActivityUtils.getTopActivity()) .title(R.string.location_permission) .content(R.string.bluetooth_need_location_permission) .canceledOnTouchOutside(false) .positiveText(R.string.to_allow) .negativeText(R.string.refuse) .onPositive((dialog, which) -> { XXPermissions.with(ActivityUtils.getTopActivity()) .permission(Permission.BLUETOOTH_CONNECT) .request(new OnPermissionCallback() { @Override public void onGranted(List permissions, boolean all) { checkConnectLast(); } @Override public void onDenied(List permissions, boolean never) { if (never) { ToastUtils.showLong(R.string.bluetooth_connect_need_permission); XXPermissions.startPermissionActivity(ActivityUtils.getTopActivity(), permissions, new OnPermissionPageCallback() { @Override public void onGranted() { requestBluetoothPermission(); } @Override public void onDenied() { ToastUtils.showLong(R.string.bluetooth_connect_need_permission); } }); } else { requestBluetoothPermission(); } } }); }) .onNegative((dialog, which) -> { }).show(); } } else {//S以下,需要请求两个权限,位置和Connect权限 if (XXPermissions.isGranted(ActivityUtils.getTopActivity(), Permission.ACCESS_FINE_LOCATION, Permission.BLUETOOTH_CONNECT)) { checkConnectLast(); } else { new MaterialDialog.Builder(ActivityUtils.getTopActivity()) .title(R.string.location_permission) .content(R.string.bluetooth_need_location_permission) .canceledOnTouchOutside(false) .positiveText(R.string.to_allow) .negativeText(R.string.refuse) .onPositive((dialog, which) -> { XXPermissions.with(ActivityUtils.getTopActivity()) .permission(Permission.ACCESS_FINE_LOCATION, Permission.BLUETOOTH_CONNECT) .request(new OnPermissionCallback() { @Override public void onGranted(List permissions, boolean all) { if (all) { checkConnectLast(); } else { requestBluetoothPermission(); } } @Override public void onDenied(List permissions, boolean never) { if (never) { ToastUtils.showLong(R.string.bluetooth_connection_requires_positioning_permission_please_turn_it_on_manually); XXPermissions.startPermissionActivity(ActivityUtils.getTopActivity(), permissions, new OnPermissionPageCallback() { @Override public void onGranted() { requestBluetoothPermission(); } @Override public void onDenied() { ToastUtils.showLong(R.string.bluetooth_connect_need_permission); } }); } else { requestBluetoothPermission(); } } }); }) .onNegative((dialog, which) -> { }).show(); } } } /** * 检查权限 */ public void requestPhonePermission() { if (!XXPermissions.isGranted(ActivityUtils.getTopActivity(), Permission.READ_PHONE_STATE)) { long lastReadPhoneStateDeniedTime = Util.getLongPreference("lastReadPhoneStateDeniedTime", 0L); if (System.currentTimeMillis() - lastReadPhoneStateDeniedTime > 48 * 60 * 60 * 1000L) {//每48小时提示一次 new MaterialDialog.Builder(ActivityUtils.getTopActivity()) .title(R.string.mobile_phone_permissions) .content(R.string.verify_imei_imsi_code_to_prevent_account_theft) .canceledOnTouchOutside(false) .positiveText(R.string.to_allow) .negativeText(R.string.refuse) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { XXPermissions.with(ActivityUtils.getTopActivity()) .permission(Permission.READ_PHONE_STATE) .request(new OnPermissionCallback() { @Override public void onGranted(List permissions, boolean all) { } @Override public void onDenied(List permissions, boolean never) { if (never) { ToastUtils.showShort(R.string.manually_enable_the_phone_state_permission_to_bind_hardware_devices); } Util.putPreference("lastReadPhoneStateDeniedTime", System.currentTimeMillis()); } }); } }) .onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { Util.putPreference("lastReadPhoneStateDeniedTime", System.currentTimeMillis()); } }).show(); } } } public void showRemindConnectDeviceDialog() { new MaterialDialog.Builder(ActivityUtils.getTopActivity()) .title(R.string.hint) .content(R.string.no_instrument_connected) .positiveText(R.string.connect) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { requestBluetoothPermission(); } }) .negativeText(R.string.cancel) .show(); } public void checkConnectLast() { if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_SPP) { if (!ServiceUtils.isServiceRunning(BTService.class.getName()) && XXPermissions.isGranted(activity(), Permission.BLUETOOTH_CONNECT)) { ServiceUtils.startService(BTService.class); } } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_BLE) { if (!ServiceUtils.isServiceRunning(BleService.class.getName()) && XXPermissions.isGranted(activity(), Permission.BLUETOOTH_CONNECT)) { ServiceUtils.startService(BleService.class); } } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_QXBT) { //千寻RTK需要GnssServer连接蓝牙 } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_HOTSPOT) { if (!ServiceUtils.isServiceRunning(TsSocketService.class.getName())) { ServiceUtils.startService(TsSocketService.class); } } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_OTG) { if (!ServiceUtils.isServiceRunning(OTGCommService.class.getName())) { ServiceUtils.startService(OTGCommService.class); } } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_TPCOM) { if (!ServiceUtils.isServiceRunning(TsSocketService.class.getName())) { ServiceUtils.startService(TsSocketService.class); } } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_PHONE_LOCATION) { if (!ServiceUtils.isServiceRunning(NativePositioningService.class.getName())) { ServiceUtils.startService(NativePositioningService.class); ThreadPoolUtil.execute(() -> Device.getInstance().requestConnect(), 500); } } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_EMULATOR) { if (!ServiceUtils.isServiceRunning(EmulatorService.class.getName())) { ServiceUtils.startService(EmulatorService.class); } } if (!Device.getInstance().isDeviceConnected()) { if (!"".equals(Device.getInstance().deviceBlueName)) { String instrumentInfo = ActivityUtils.getTopActivity().getString(R.string.instrument_name) + ":" + Device.getInstance().deviceBlueName + "\n" + ActivityUtils.getTopActivity().getString(R.string.instrument_type_name) + ":" + Device.getInstance().deviceBrand; new MaterialDialog.Builder(ActivityUtils.getTopActivity()) .title(R.string.quick_connect) .content(instrumentInfo) .positiveText(Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS ? R.string.connect_and_setup_station : R.string.connect) .negativeText(R.string.config) .neutralText(R.string.switch_instrument) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_HOTSPOT) { startHotspotComm(); } else { if (DeviceUtil.checkIfNeedGnssServer()) { if (DeviceUtil.checkIfGnssServerReady(ActivityUtils.getTopActivity())) {//先检查如果是千寻rtk,是否安装并打开了GnssServier gnssServerReady = true; } } else { Device.getInstance().requestConnect(); ToastUtils.showShort(R.string.connecting_please_wait); } } } }).onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { Intent intent; if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS) { intent = new Intent(ActivityUtils.getTopActivity(), ConnectTSActivity.class); } else { intent = new Intent(ActivityUtils.getTopActivity(), ConnectRtkActivity.class); } intent.putExtra("customChannel", AppChannel.customChannel); ActivityUtils.getTopActivity().startActivity(intent); } }).onNeutral(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { chooseInstrumentType(); } }).show(); } else { chooseInstrumentType(); } } else { if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_PHONE_LOCATION) { ToastUtils.showShort(R.string.native_rtk_is_running); } else { Intent intent; if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS) { intent = new Intent(ActivityUtils.getTopActivity(), ConnectTSActivity.class); } else { intent = new Intent(ActivityUtils.getTopActivity(), ConnectRtkActivity.class); } intent.putExtra("customChannel", AppChannel.customChannel); ActivityUtils.getTopActivity().startActivity(intent); } } } public void checkGnssServerReady() { if (gnssServerReady) { new MaterialDialog.Builder(ActivityUtils.getTopActivity()) .title(R.string.hint) .content(R.string.you_need_start_gnss_server_for_communication) .positiveText(R.string.started).onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { if (RTK.getInstance() instanceof QxwzRTK) { Device.getInstance().connectType = ConnectTypeEnum.CONNECT_TYPE_QXBT; ServiceUtils.startService(QxwzMessengerService.class); } } }).negativeText(R.string.cancel).dismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { gnssServerReady = false; } }).show(); } } private void chooseInstrumentType() { new MaterialDialog.Builder(ActivityUtils.getTopActivity()) .title(R.string.choose_instrument_type) .items(new String[]{ActivityUtils.getTopActivity().getString(R.string.total_station), ActivityUtils.getTopActivity().getString(R.string.rtk)}) .itemsCallback(new MaterialDialog.ListCallback() { @Override public void onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) { switch (which) { case 0: ConnectTSActivity.start(); break; case 1: ConnectRtkActivity.start(); break; } } }).show(); } /** * 开启wifi通信 */ private void startHotspotComm() { if (!ValidateUtil.isIPAddress(TsConfig.getInstance().getIp())) { ToastUtils.showShort(R.string.please_input_correct_ip); return; } if (TsConfig.getInstance().getPort() < 1024 || TsConfig.getInstance().getPort() > 65535) { ToastUtils.showShort(R.string.please_input_correct_port); return; } if (DeviceUtil.isWifiApOpen()) { ServiceUtils.stopService(EmulatorService.class); ServiceUtils.stopService(LocationService.class); ServiceUtils.stopService(NativePositioningService.class); ServiceUtils.stopService(BTService.class); ServiceUtils.stopService(BleService.class); ServiceUtils.startService(TsSocketService.class); ThreadPoolUtil.execute(new Runnable() { @Override public void run() { Device.getInstance().requestConnect(); } }, 200); } else { ToastUtils.showShort(R.string.please_open_hotspot_first); //打开网络共享与热点设置页面 if (RomUtil.isOppo() || RomUtil.isLenove() || RomUtil.isGionee()) { //OPPO系统系统特殊,会让在Manifest.xml声明Settings$TetherSettingsActivity,现在让用户自己找热点界面,并开启 ToastUtils.showShort(R.string.find_tether_setting_and_open); ActivityUtils.getTopActivity().startActivity(new Intent(Settings.ACTION_SETTINGS)); } else { Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ComponentName comp = new ComponentName("com.android.settings", "com.android.settings.Settings$TetherSettingsActivity"); intent.setComponent(comp); ActivityUtils.getTopActivity().startActivity(intent); } } } }