package com.xypower.mpapp; import android.Manifest; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Build; import android.os.Environment; import android.os.FileObserver; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.Messenger; import android.os.StrictMode; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.core.app.ActivityCompat; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.View; import android.widget.Toast; import com.dev.devapi.api.SysApi; import com.dowse.camera.client.DSCameraManager; import com.xypower.common.CameraUtils; import com.xypower.common.MicroPhotoContext; import com.xypower.mpapp.databinding.ActivityMainBinding; import com.xypower.mpapp.utils.RandomReader; import java.io.File; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; public class MainActivity extends AppCompatActivity { public static final String TAG = "MPLOG"; private static int MY_PERMISSIONS_REQUEST_FOREGROUND_SERVICE = 100; public static final int MSG_WHAT_LOG_OBSERVER = MicroPhotoService.MSG_WHAT_MAX + 10; // Used to load the 'microphoto' library on application startup. static { System.loadLibrary("microphoto"); } public static final int MAX_LOG_LINES = 480; public static final int MIN_LOG_LINES = 120; private ActivityMainBinding binding; private Handler mHandler = null; private Messenger mMessenger = null; private LogFileObserver mLogFileObserver = null; private class LogFileObserver extends FileObserver { private long mOffset = 0; private String mPath = null; public LogFileObserver(String path) { super(path, FileObserver.MODIFY | FileObserver.CREATE); mPath = path; File file = new File(path); if (file.exists()) { mOffset = file.length(); } } @Override public void onEvent(int event, String s) { int e = event & FileObserver.ALL_EVENTS; if (e == FileObserver.MODIFY) { File file = new File(mPath); long newOffset = file.length(); if (newOffset > mOffset) { RandomReader reader = new RandomReader(mPath, mOffset); byte[] bytes = new byte[(int)(newOffset - mOffset)]; int bytesRead = reader.read(bytes); mOffset += bytesRead; Message msg = Message.obtain(); msg.what = MSG_WHAT_LOG_OBSERVER; msg.obj = bytes; msg.arg1 = bytesRead; mHandler.sendMessage(msg); } } else if (e == FileObserver.CREATE) { mOffset = 0; } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); // getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); // InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); // imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); // ViewUtils.hideSoftKeyboard(this); ActionBar actionBar = getSupportActionBar(); // String buildTime = BuildConfig.BUILD_ Date date = new Date(BuildConfig.BUILD_TIMESTAMP); // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); actionBar.setTitle(actionBar.getTitle().toString() + " v" + MicroPhotoContext.getVersionName(getApplicationContext()) + " " + sdf.format(date)); // CompactSpinnerAdapter adapter = new CompactSpinnerAdapter(this, R.array.networkProtocols, R.layout.spinner_dropdown_item); // adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // binding.networkProtocol.setAdapter(adapter); // ArrayAdapter adapter1 = ArrayAdapter.createFromResource(this, R.array.networkProtocols, android.R.layout.simple_spinner_item); // adapter1.setDropDownViewResource(R.layout.spinner_dropdown_item); // binding.protocol.setAdapter(adapter1); binding.logs.setText(""); binding.logs.setMovementMethod(ScrollingMovementMethod.getInstance()); binding.logs.setScrollbarFadingEnabled(false); mHandler = new Handler(Looper.myLooper()) { @Override public void handleMessage(@NonNull Message msg) { switch (msg.what) { case MSG_WHAT_LOG_OBSERVER: { byte[] bytes = (byte[])msg.obj; int bytesRead = msg.arg1; String log = null; try { log = new String(bytes, 0, bytesRead, "UTF-8"); } catch (Exception e) { e.printStackTrace(); } if (log != null) { binding.logs.append(log); int offset = binding.logs.getLineCount() * binding.logs.getLineHeight(); if (offset > binding.logs.getHeight()) { binding.logs.scrollTo(0, offset - binding.logs.getHeight() + binding.logs.getLineHeight()); } } } break; } } }; // mMessenger = new Messenger(new Handler()); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); Intent intent = getIntent(); final int noDelay = intent.getIntExtra("noDelay", 0); int rebootFlag = intent.getIntExtra("reboot", 0); if (rebootFlag == 1) { // SysApi.enableAirPlane(MainActivity.this, true); Log.i(TAG, "After Reboot"); } Log.d(TAG, "MainActivity: reboot=" + rebootFlag + " noDelay=" + noDelay); MicroPhotoContext.AppConfig appConfig = getAppConfig(); binding.cmdid.setText(appConfig.cmdid); binding.server.setText(appConfig.server); binding.port.setText(appConfig.port != 0 ? Integer.toString(appConfig.port) : ""); String protocolStr = appConfig.protocol + "-"; for (int idx = 0; idx < binding.protocol.getCount(); idx++) { String item = binding.protocol.getItemAtPosition(idx).toString(); if (item.startsWith(protocolStr)) { binding.protocol.setSelection(idx); break; } } if (appConfig.networkProtocol < binding.networkProtocol.getCount()) { binding.networkProtocol.setSelection(appConfig.networkProtocol); } binding.heartbeat.setText((appConfig.heartbeat > 0) ? Integer.toString(appConfig.heartbeat) : ""); binding.packetSize.setText((appConfig.packetSize > 0) ? Integer.toString(appConfig.packetSize) : ""); if (appConfig.network < binding.network.getCount()) { binding.network.setSelection(appConfig.network); } this.binding.btnStartServ.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String[] accessPermissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.FOREGROUND_SERVICE, Manifest.permission.READ_PHONE_STATE, /*Manifest.permission.PACKAGE_USAGE_STATS,*/ /*Manifest.permission.SET_TIME,*/}; boolean needRequire = false; for (String access : accessPermissions) { int curPermission = ActivityCompat.checkSelfPermission(MainActivity.this, access); if (curPermission != PackageManager.PERMISSION_GRANTED) { needRequire = true; break; } } if (needRequire) { ActivityCompat.requestPermissions(MainActivity.this, accessPermissions, MY_PERMISSIONS_REQUEST_FOREGROUND_SERVICE); return; } binding.logs.setText(""); MicroPhotoContext.AppConfig curAppConfig = retrieveAndSaveAppConfig(); startMicroPhotoService(MainActivity.this.getApplicationContext(), appConfig, mMessenger); binding.btnStartServ.setEnabled(false); binding.btnStopServ.setEnabled(true); } }); this.binding.btnSaveCfg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { retrieveAndSaveAppConfig(); } }); this.binding.btnTakePhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { takePhoto(1, 255, true); } }); this.binding.btnTakePhoto2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { takePhoto(2, 255, true); } }); this.binding.btnTakePhoto3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { takePhoto(3, 255, true); } }); this.binding.btnTakePhoto4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { takePhoto(4, 255, true); } }); this.binding.takeVideoBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { takePhoto(1, 255, false); } }); this.binding.takeVideoBtn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { takePhoto(2, 255, false); } }); this.binding.takeVideoBtn3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { takePhoto(3, 255, false); } }); this.binding.takeVideoBtn4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { takePhoto(4, 255, false); } }); this.binding.btnStopServ.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // Intent intent = new Intent(MainActivity.this, MicroPhotoService.class); // intent.setAction(MicroPhotoService.ACTION_STOP); // MainActivity.this.stopService(intent); MicroPhotoService.stopTerminalService(getApplicationContext()); binding.btnStartServ.setEnabled(true); binding.btnStopServ.setEnabled(false); } }); binding.simchange.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // defaultDataSubId = getDefaultDataSubId(); // System.out.println(defaultDataSubId); } }); binding.simchange2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { /* if (defaultDataSubId == 0) { setDefaultDataSubId(1); } else { if (defaultDataSubId == 1) { setDefaultDataSubId(2); } else { setDefaultDataSubId(1); } } */ } }); binding.btnChannels.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, ChannelActivity.class); startActivity(intent); } }); binding.gps.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // gpsTake(); startLocate(); // LocationUtils.unregister(); } }); binding.netgps.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // startLocate(); boolean gpsEnabled = LocationUtil.isGpsEnabled(MainActivity.this); System.out.printf("g" + gpsEnabled); LocationUtil.register(MainActivity.this, 0, 0, new LocationUtil.OnLocationChangeListener() { @Override public void getLastKnownLocation(Location location) { Log.e("xyh", "onLocationChanged: " + location.getLatitude()); } @Override public void onLocationChanged(Location location) { //位置信息变化时触发 Log.e("xyh", "定位方式:" + location.getProvider()); Log.e("xyh", "纬度:" + location.getLatitude()); Log.e("xyh", "经度:" + location.getLongitude()); Log.e("xyh", "海拔:" + location.getAltitude()); Log.e("xyh", "时间:" + location.getTime()); Log.e("xyh", "国家:" + LocationUtil.getCountryName(MainActivity.this, location.getLatitude(), location.getLongitude())); Log.e("xyh", "获取地理位置:" + LocationUtil.getAddress(MainActivity.this, location.getLatitude(), location.getLongitude())); Log.e("xyh", "所在地:" + LocationUtil.getLocality(MainActivity.this, location.getLatitude(), location.getLongitude())); Log.e("xyh", "所在街道:" + LocationUtil.getStreet(MainActivity.this, location.getLatitude(), location.getLongitude())); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { System.out.println("dfsad"); } }); } }); if (!MicroPhotoService.isRunning && !TextUtils.isEmpty(appConfig.cmdid) && !TextUtils.isEmpty(appConfig.server) && appConfig.port != 0) { Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { if (binding.btnStartServ.isEnabled()) { binding.btnStartServ.performClick(); } } }; handler.postDelayed(runnable, noDelay != 0 ? 1000 : 5000); } binding.btnStartServ.setEnabled(!MicroPhotoService.isRunning); binding.btnStopServ.setEnabled(MicroPhotoService.isRunning); binding.tcpudp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // initSocket(); } }); binding.tcpudpsend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // byte[] bytes = {(byte) 0xA5, 0x5A, 0x04, 0x00, 0x58, 0x59, 0x49, 0x47, 0x51, 0x31, 0x30, 0x44, 0x32, 0x32, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x07, (byte) 0xE7, 0x37, (byte) 0x86, (byte) 0x96, (byte) 0xD4, 0x64, (byte) 0xB5, (byte) 0xFB, (byte) 0x96}; byte[] bytes = {(byte) 0xA5, 0x5A, 0x04, 0x00, 0x58, 0x59, 0x49, 0x47, 0x51, 0x31, 0x30, 0x44, 0x32, 0x32, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x07, (byte) 0xE6, (byte) 0xEA, 0x52, (byte) 0xB7, (byte) 0xD4, 0x64, 0x5C, 0x7E, (byte) 0x96}; // NettyChatClient.getInstance().sendByteMessage(bytes); } }); binding.video.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { } }); binding.video2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); binding.btnSendHb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MicroPhotoService.sendHeartbeat(getApplicationContext()); } }); binding.btnRestartApp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Context context = v.getContext().getApplicationContext(); MicroPhotoService.restartApp(context, context.getPackageName()); } }); binding.btnReboot.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext()); builder.setTitle(R.string.confirm_reboot); builder.setMessage(R.string.text_confirm_reboot); builder.setCancelable(true); builder.setPositiveButton(R.string.btn_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialogInterface.dismiss(); SysApi.reboot(v.getContext().getApplicationContext()); } }); builder.setNegativeButton(R.string.btn_cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialogInterface.dismiss(); } }); builder.show(); } }); binding.btnCameraInfo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SysApi.setOtgState(true); // SysApi.setOtgState(true); SysApi.setCam3V3Enable(true); Runnable runnable = new Runnable() { @Override public void run() { String cameraInfo = CameraUtils.getAllCameraInfo(view.getContext()); Log.d(TAG, cameraInfo); SysApi.setCam3V3Enable(false); SysApi.setOtgState(false); Toast.makeText(view.getContext(), cameraInfo, Toast.LENGTH_LONG).show(); } }; mHandler.postDelayed(runnable, 1500); } }); } public static void startMicroPhotoService(Context context, MicroPhotoContext.AppConfig curAppConfig, Messenger messenger) { if (TextUtils.isEmpty(curAppConfig.cmdid) || TextUtils.isEmpty(curAppConfig.server) || curAppConfig.port == 0) { return; } Intent intent = new Intent(context, MicroPhotoService.class); intent.setAction(MicroPhotoService.ACTION_START); intent.putExtra("cmdid", curAppConfig.cmdid); intent.putExtra("server", curAppConfig.server); intent.putExtra("port", curAppConfig.port); intent.putExtra("protocol", curAppConfig.protocol); intent.putExtra("networkProtocol", curAppConfig.networkProtocol); intent.putExtra("network", curAppConfig.network); if (messenger != null) { intent.putExtra("messenger", messenger); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { context.startForegroundService(intent); } else { context.startService(intent); } } private void takePhoto(int channel, int preset, boolean photoOrVideo) { MicroPhotoService.takePhoto(this.getApplicationContext(), channel, preset, photoOrVideo); } @Override protected void onResume() { // call the superclass method first super.onResume(); try { String logFilePath = MicroPhotoContext.buildAppDir(this.getApplicationContext()); logFilePath += "logs"; File file = new File(logFilePath); if (!file.exists()) { file.mkdirs(); } logFilePath += "/log.txt"; file = new File(logFilePath); if (!file.exists()) { file.createNewFile(); } mLogFileObserver = new LogFileObserver(logFilePath); mLogFileObserver.startWatching(); Log.i(TAG, "Log Observer Started"); int lines = binding.logs.getLineCount(); if (lines > MAX_LOG_LINES) { int excessLineNumber = lines - MIN_LOG_LINES; int eolIndex = -1; CharSequence charSequence = binding.logs.getText(); for (int i = 0; i < excessLineNumber; i++) { do { eolIndex++; } while (eolIndex < charSequence.length() && charSequence.charAt(eolIndex) != '\n'); } if (eolIndex < charSequence.length()) { binding.logs.getEditableText().delete(0, eolIndex + 1); } } } catch (Exception e) { e.printStackTrace(); } } @Override protected void onPause() { // call the superclass method first super.onPause(); try { if (mLogFileObserver != null) { mLogFileObserver.stopWatching(); mLogFileObserver = null; Log.i(TAG, "Log Observer Stopped"); } } catch (Exception e) { e.printStackTrace(); } } @Override protected void onDestroy() { super.onDestroy(); } private void setDefaultDataSubId(int subId) { SubscriptionManager subscriptionManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); try { Method method = subscriptionManager.getClass().getDeclaredMethod("setDefaultDataSubId", int.class); method.invoke(subscriptionManager, subId); TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Method method1 = telephonyManager.getClass().getDeclaredMethod("setDataEnabled", boolean.class); method1.invoke(telephonyManager, true); } catch (Exception e) { Log.e(TAG, "wjz debug setDefaultDataSubId: error is " + e.getMessage()); } } private MicroPhotoContext.AppConfig retrieveAndSaveAppConfig() { MicroPhotoContext.AppConfig appConfig = new MicroPhotoContext.AppConfig(); appConfig.cmdid = MainActivity.this.binding.cmdid.getText().toString(); appConfig.server = MainActivity.this.binding.server.getText().toString(); String portStr = MainActivity.this.binding.port.getText().toString(); appConfig.port = TextUtils.isEmpty(portStr) ? 0 : Integer.parseInt(portStr); String protocolStr = MainActivity.this.binding.protocol.getSelectedItem().toString(); appConfig.protocol = MicroPhotoContext.DEFAULT_PROTOCOL; String[] parts = protocolStr.split("-"); if (parts != null) { appConfig.protocol = Integer.parseInt(parts[0]); } appConfig.networkProtocol = MainActivity.this.binding.networkProtocol.getSelectedItemPosition(); appConfig.heartbeat = TextUtils.isEmpty(binding.heartbeat.getText().toString()) ? 0 : Integer.parseInt(binding.heartbeat.getText().toString()); appConfig.packetSize = TextUtils.isEmpty(binding.packetSize.getText().toString()) ? 0 : Integer.parseInt(binding.packetSize.getText().toString()); appConfig.network = MainActivity.this.binding.network.getSelectedItemPosition(); saveAppConfig(appConfig); return appConfig; } private MicroPhotoContext.AppConfig getAppConfig() { return MicroPhotoContext.getAppConfig(this.getApplicationContext()); } private void saveAppConfig(MicroPhotoContext.AppConfig appConfig) { MicroPhotoContext.saveAppConfig(getApplicationContext(), appConfig); } private int getDefaultDataSubId() { SubscriptionManager subscriptionManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); try { Method method = subscriptionManager.getClass().getDeclaredMethod("getDefaultDataSubscriptionId"); return (int) method.invoke(subscriptionManager); } catch (Exception e) { Log.e(TAG, "wjz debug getDefaultDataSubId: error is " + e.getMessage()); } return 0; } protected void takePhoto() { File path = Environment.getExternalStorageDirectory(); File file = new File(path, "photo.jpg"); boolean res = false; res = DSCameraManager.getInstace().init(); res = DSCameraManager.getInstace().takePhoto(file.getAbsolutePath(), 2); if (!res) { int aa = 0; } res = DSCameraManager.getInstace().unInit(); } public native boolean takePhoto(int channel, int preset, String path, String fileName); private void gpsTake() { LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // 注册位置监听器 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (lastKnownLocation != null) { double latitude = lastKnownLocation.getLatitude(); double longitude = lastKnownLocation.getLongitude(); // 处理最新位置信息 System.out.printf("gps" + latitude + "fds:" + longitude); } } LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { // 处理位置更新事件 double latitude = location.getLatitude(); double longitude = location.getLongitude(); // ... Log.e("xyh", "定位方式:" + location.getProvider()); Log.e("xyh", "纬度:" + location.getLatitude()); Log.e("xyh", "经度:" + location.getLongitude()); Log.e("xyh", "海拔:" + location.getAltitude()); Log.e("xyh", "时间:" + location.getTime()); Log.e("xyh", "国家:" + LocationUtil.getCountryName(MainActivity.this, location.getLatitude(), location.getLongitude())); Log.e("xyh", "获取地理位置:" + LocationUtil.getAddress(MainActivity.this, location.getLatitude(), location.getLongitude())); Log.e("xyh", "所在地:" + LocationUtil.getLocality(MainActivity.this, location.getLatitude(), location.getLongitude())); Log.e("xyh", "所在街道:" + LocationUtil.getStreet(MainActivity.this, location.getLatitude(), location.getLongitude())); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // 处理位置状态变化事件 System.out.printf("fsdaf"); } @Override public void onProviderEnabled(String provider) { // 处理位置提供者启用事件 System.out.printf("fsdaf"); } @Override public void onProviderDisabled(String provider) { // 处理位置提供者禁用事件 System.out.printf("fsdaf"); } }; private void startLocate() { LocationManager mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); boolean providerEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if (providerEnabled) { //GPS已开启 /** * 绑定监听 * 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种,前者是GPS,后者是GPRS以及WIFI定位 * 参数2,位置信息更新周期.单位是毫秒 * 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息 * 参数4,监听 * 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新 */ if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); } else { Toast.makeText(this, "请打开GPS", Toast.LENGTH_SHORT).show(); } } // private void initSocket() { // NettyChatClient nettyChatClient = NettyChatClient.newInstance("47.96.238.157", 6891); //// NettyChatClient nettyChatClient = NettyChatClient.newInstance("180.166.218.222", 40032); // nettyChatClient.init(new INettyMessageListener() { // @Override // public void onReceive(String message) { //// for (INettyMessageListener nettyMessageListener : mIMessageListenerList) { //// nettyMessageListener.onReceive(message); //// } // System.out.println("dsfa"); // } // // @Override // public void onConnectSuccess() { //// for (INettyMessageListener nettyMessageListener : mIMessageListenerList) { //// nettyMessageListener.onConnectSuccess(); //// } // System.out.println("dsfa"); // } // // @Override // public void onError() { //// for (INettyMessageListener nettyMessageListener : mIMessageListenerList) { //// nettyMessageListener.onError(); //// } // System.out.println("dsfa"); // } // }); // nettyChatClient.connect(); // } }