package com.info.sn.base; import android.app.Application; import android.content.Context; import android.os.Handler; import android.os.Looper; import android.util.Log; import com.amap.api.location.AMapLocation; import com.amap.api.location.AMapLocationClient; import com.amap.api.location.AMapLocationClientOption; import com.amap.api.location.AMapLocationListener; import com.arialyy.aria.core.Aria; import com.info.sn.BuildConfig; import com.info.sn.activity.MainActivity; import com.info.sn.network.HTTPInterface; import com.info.sn.utils.LogUtils; import com.info.sn.utils.SPUtils; import com.info.sn.utils.ToastUtil; import org.json.JSONException; import org.json.JSONObject; //import com.blankj.utilcode.util.NetworkUtils; //public class MyApplication extends Application implements NetworkUtils.OnNetworkStatusChangedListener { public class MyApplication extends Application { public static Context context; private static MyApplication app; private static AMapLocationClient locationClient = null; @Override public void onCreate() { super.onCreate(); app = this; if (!BuildConfig.DEBUG) { catchException(); } ToastUtil.init(this); context = getApplicationContext(); Aria.init(this); Aria.download(this).resumeAllTask(); } private void catchException() { Thread.setDefaultUncaughtExceptionHandler( new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { Log.d("捕获异常子线程:", Thread.currentThread().getName() + "在:" + e.getStackTrace()[0].getClassName()); } } ); //下面是新增方法! new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { while (true) { try { Looper.loop(); //会先执行这个方法,然后在执行下面的异常捕获方法! } catch (Exception e) { Log.d("捕获异常主线程:", Thread.currentThread().getName() + "在:" + e.getStackTrace()[0].getClassName()); e.printStackTrace(); } } } }); } // protected void attachBaseContext(Context newBase) { // super.attachBaseContext(newBase); // MultiDex.install(this); // } @Override public void onTerminate() { super.onTerminate(); //销毁时,需要销毁定位client if (null != locationClient) { locationClient.onDestroy(); } } public static MyApplication getInstance() { return app; } public static Context getAppContext() { if (context == null) { context = getAppContext(); } return context; } public static AMapLocationClient getLocationClient() { if (null == locationClient) { initAmap(); } return locationClient; } private static void initAmap() { locationClient = new AMapLocationClient(context); AMapLocationClientOption option = new AMapLocationClientOption(); option.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn); option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); option.setNeedAddress(true); //获取一次定位结果: //该方法默认为false。 option.setOnceLocation(true); //获取最近3s内精度最高的一次定位结果: //设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。 // 如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。 option.setOnceLocationLatest(true); locationClient.setLocationOption(option); //设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。 //设置定位监听 locationClient.setLocationListener(new AMapLocationListener() { @Override public void onLocationChanged(AMapLocation aMapLocation) { StringBuffer sb = new StringBuffer(); //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明 if (aMapLocation.getErrorCode() == 0) { sb.append(aMapLocation.getAddress() + "\n"); SPUtils.put(context, "AmapAddress", aMapLocation.getAddress()); SPUtils.put(context, "longitude", aMapLocation.getLongitude()); SPUtils.put(context, "latitude", aMapLocation.getLatitude()); } else { //定位失败 sb.append("定位失败" + "\n"); SPUtils.put(context, "AmapError", aMapLocation.getErrorInfo()); } // Log.e("AmapAddress", (String) SPUtils.get(context, "AmapAddress", "")); // Log.e("AmapError", (String) SPUtils.get(context, "AmapError", "")); Log.e("addr", sb.toString()); HTTPInterface.updateAdminInfo(context); } }); //设置场景模式后最好调用一次stop,再调用start以保证场景模式生效 locationClient.stopLocation(); locationClient.startLocation(); } }