package com.shunzhi.parent; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.text.TextUtils; import com.amap.api.location.AMapLocation; import com.amap.api.location.AMapLocationClient; import com.amap.api.location.AMapLocationClientOption; import com.amap.api.location.AMapLocationClientOption.AMapLocationMode; import com.amap.api.location.AMapLocationListener; import com.netease.nimlib.sdk.NIMClient; import com.netease.nimlib.sdk.SDKOptions; import com.netease.nimlib.sdk.StatusBarNotificationConfig; import com.netease.nimlib.sdk.auth.LoginInfo; import com.share.mvpsdk.global.GlobalApplication; import com.share.mvpsdk.helper.RetrofitCreateHelper; import com.shunzhi.parent.bean.message.DaoMaster; import com.shunzhi.parent.bean.message.DaoSession; import com.shunzhi.parent.db.DBControl; import com.shunzhi.parent.dbhelper.GreenDaoDatabaseOpenHelper; import com.shunzhi.parent.manager.MessageManager; import com.shunzhi.parent.ui.MainActivity; import org.greenrobot.greendao.database.Database; import org.greenrobot.greendao.database.DatabaseOpenHelper; import timber.log.Timber; /** * Created by Administrator on 2018/3/7 0007. */ public class AppContext extends GlobalApplication { private static AppContext appContext; public final static int LOCATION_CITYNAME = 0x00; public String cityName = "", district = ""; public DaoSession getDaoSession() { return daoSession; } private DaoSession daoSession; public static AppContext getInstance() { return appContext; } //声明AMapLocationClient类对象 public AMapLocationClient mLocationClient = null; //声明AMapLocationClientOption对象 public AMapLocationClientOption mLocationOption = null; private MessageManager messageManager; @Override public void onCreate() { appContext = this; super.onCreate(); DBControl.init(appContext); NIMClient.init(this, loginInfo(), options()); if (inMainProcess(this)) { //开启地图地位 initMapLocal(); initDB(); RetrofitCreateHelper.getInstance().setAuthorization(AppConfig.getAppConfig(this).get(AppConfig.ACCESS_TOKEN)); messageManager = MessageManager.getInstance(); } } public MessageManager getMessageManager() { return messageManager; } private void initDB() { //如果需要对数据库加密可以使用注释掉的方法,密码设置方式可以参考微信的数据密码生成方式: //读取手机的IMEI与APP安装时生成的随机码(微信是在登录账号以后为不同的账号创建不同的文件夹微信随机码是微信账号的id)拼接, // 经md5加密后取前n位做密码 // DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, ENCRYPTED ? "notes-db-encrypted" : "notes-db"); // Database db = ENCRYPTED ? helper.getEncryptedWritableDb("super-secret") : helper.getWritableDb(); DatabaseOpenHelper helper = new GreenDaoDatabaseOpenHelper(this, "pw_messages"); Database db = helper.getWritableDb(); daoSession = new DaoMaster(db).newSession(); } private SDKOptions options() { SDKOptions options = new SDKOptions(); // 如果将新消息通知提醒托管给 SDK 完成,需要添加以下配置。否则无需设置。 StatusBarNotificationConfig config = new StatusBarNotificationConfig(); config.notificationEntrance = MainActivity.class; // 点击通知栏跳转到该Activity config.notificationSmallIconId = R.mipmap.ic_launcher; options.sdkStorageRootPath = getExternalFilesDir(null).getPath() + "/nim"; options.statusBarNotificationConfig = config; //options.preloadAttach=false; return options; } private LoginInfo loginInfo() { SharedPreferences sp = getSharedPreferences("info", Context.MODE_PRIVATE); String account = sp.getString("account", ""); String token = sp.getString("token", ""); Timber.i("---===account: %s token : %s",account,token); if (account.length() > 0 && token.length() > 0) { return new LoginInfo(account, token); } return null; } public static boolean inMainProcess(Context context) { String packageName = context.getPackageName(); String processName = getProcessName(context); return packageName.equals(processName); } /** * 获取当前进程名 * * @param context * @return 进程名 */ public static final String getProcessName(Context context) { String processName = null; // ActivityManager ActivityManager am = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)); while (true) { for (ActivityManager.RunningAppProcessInfo info : am.getRunningAppProcesses()) { if (info.pid == android.os.Process.myPid()) { processName = info.processName; break; } } // go home if (!TextUtils.isEmpty(processName)) { return processName; } // take a rest and again try { Thread.sleep(100L); } catch (InterruptedException ex) { ex.printStackTrace(); } } } private void initMapLocal() { //初始化定位 mLocationClient = new AMapLocationClient(getApplicationContext()); //设置定位回调监听 mLocationClient.setLocationListener(mLocationListener); //初始化AMapLocationClientOption对象 mLocationOption = new AMapLocationClientOption(); /** * 设置定位场景,目前支持三种场景(签到、出行、运动,默认无场景) */ mLocationOption.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn); //设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。 mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy); //设置定位模式为AMapLocationMode.Battery_Saving,低功耗模式。 // mLocationOption.setLocationMode(AMapLocationMode.Battery_Saving); //设置定位模式为AMapLocationMode.Device_Sensors,仅设备模式。 // mLocationOption.setLocationMode(AMapLocationMode.Device_Sensors); //设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。 mLocationOption.setInterval(1000); //设置是否允许模拟位置,默认为true,允许模拟位置 mLocationOption.setMockEnable(true); //单位是毫秒,默认30000毫秒,建议超时时间不要低于8000毫秒。 mLocationOption.setHttpTimeOut(20000); //关闭缓存机制 mLocationOption.setLocationCacheEnable(false); if (null != mLocationClient) mLocationClient.setLocationOption(mLocationOption); //启动定位 startLocation(); } public void startLocation() { //启动定位 if (null != mLocationClient) { // mLocationClient.setLocationOption(mLocationOption); //设置场景模式后最好调用一次stop,再调用start以保证场景模式生效 stopLocation(); mLocationClient.startLocation(); } else initMapLocal(); } public void stopLocation() { if (null != mLocationClient) mLocationClient.stopLocation(); } public void destoryLocation() { if (null != mLocationClient) mLocationClient.onDestroy(); } //声明定位回调监听器 public AMapLocationListener mLocationListener = new AMapLocationListener() { @Override public void onLocationChanged(AMapLocation aMapLocation) { if (null != aMapLocation) { if (aMapLocation.getErrorCode() == 0) { cityName = aMapLocation.getCity(); district = aMapLocation.getDistrict(); aMapLocation.getCityCode(); Intent intent = new Intent(); intent.setAction(LOCATION_CITYNAME + ""); sendBroadcast(intent); stopLocation(); } else { cityName = "定位失败"; district = "定位失败"; // Log.d("mlocation:","errorCode="+aMapLocation.getErrorCode()+"errorInfo="+aMapLocation.getErrorInfo()); } } } }; @Override public void onLowMemory() { super.onLowMemory(); //设置定位模式为AMapLocationMode.Battery_Saving,低功耗模式。 mLocationOption.setLocationMode(AMapLocationMode.Battery_Saving); } }