Android判断定位功能是否可用的方法
定位功能是否可用由定位服务和定位权限共同决定:
判断定位服务:
/** *手机是否开启位置服务,如果没有开启那么所有app将不能使用定位功能 */ publicstaticbooleanisLocServiceEnable(Contextcontext){ LocationManagerlocationManager=(LocationManager)context.getSystemService(Context.LOCATION_SERVICE); booleangps=locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); booleannetwork=locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); if(gps||network){ returntrue; } returnfalse; }
判断定位权限:
/** *检查权限列表 * *@paramcontext *@paramop这个值被hide了,去AppOpsManager类源码找,如位置权限AppOpsManager.OP_GPS==2 *@paramopString如判断定位权限AppOpsManager.OPSTR_FINE_LOCATION *@return@see如果返回值AppOpsManagerCompat.MODE_IGNORED表示被禁用了 */ publicstaticintcheckOp(Contextcontext,intop,StringopString){ finalintversion=Build.VERSION.SDK_INT; if(version>=19){ Objectobject=context.getSystemService(Context.APP_OPS_SERVICE); //Objectobject=context.getSystemService("appops"); Classc=object.getClass(); try{ Class[]cArg=newClass[3]; cArg[0]=int.class; cArg[1]=int.class; cArg[2]=String.class; MethodlMethod=c.getDeclaredMethod("checkOp",cArg); return(Integer)lMethod.invoke(object,op,Binder.getCallingUid(),context.getPackageName()); }catch(Exceptione){ e.printStackTrace(); if(Build.VERSION.SDK_INT>=23){ returnAppOpsManagerCompat.noteOp(context,opString,context.getApplicationInfo().uid, context.getPackageName()); } } } return-1; }
调用时先检查权限:
/** *检查定位服务、权限 */ privatevoidcheckLocationPermission(){ if(!AppUtil.isLocServiceEnable(this)){//检测是否开启定位服务 if(netErrorDialog==null||!netErrorDialog.isShowing()){ locErrorDialog=DialogUtil.showLocErrorDialog(activity,0); } }else{//检测用户是否将当前应用的定位权限拒绝 intcheckResult=AppUtil.checkOp(this,2,AppOpsManager.OPSTR_FINE_LOCATION);//其中2代表AppOpsManager.OP_GPS,如果要判断悬浮框权限,第二个参数需换成24即AppOpsManager。OP_SYSTEM_ALERT_WINDOW及,第三个参数需要换成AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOW intcheckResult2=AppUtil.checkOp(this,1,AppOpsManager.OPSTR_FINE_LOCATION); if(AppOpsManagerCompat.MODE_IGNORED==checkResult||AppOpsManagerCompat.MODE_IGNORED==checkResult2){ if(netErrorDialog==null||!netErrorDialog.isShowing()){ locErrorDialog=DialogUtil.showLocErrorDialog(activity,1); } } } }
如果不能使用,弹出对话框,根据1或2,判断跳转页面:
/** *无法定位对话框 * *@paramactivity上下文 *@paramstate权限状态0,未开启服务1,未开启权限 *@return对话框 */ publicstaticDialogshowLocErrorDialog(Activityactivity,intstate){ DialoglocErrorDialog=newDialog(activity,R.style.MyDialog); ViewcontentView=View.inflate(activity,R.layout.dialog_tip_error_loc,null); locErrorDialog.setContentView(contentView); locErrorDialog.setCanceledOnTouchOutside(true); locErrorDialog.show(); TextViewcheckNetCancel=contentView.findViewById(R.id.tv_submit_no); TextViewcheckNet=contentView.findViewById(R.id.tv_submit_yes); checkNetCancel.setOnClickListener(view->{ locErrorDialog.dismiss(); }); checkNet.setOnClickListener(view->{ locErrorDialog.dismiss(); Intentintent=newIntent(); if(state==0){ //定位服务页面 intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS); }else{ //应用详情页面 intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:"+activity.getPackageName())); } intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try{ activity.startActivity(intent); }catch(ActivityNotFoundExceptionex){ //如果页面无法打开,进入设置页面 intent.setAction(Settings.ACTION_SETTINGS); try{ activity.startActivity(intent); }catch(Exceptione){ e.printStackTrace(); } } }); returnlocErrorDialog; }
Dialog样式:
@null @android:color/transparent true @color/transparent
以上这篇Android判断定位功能是否可用的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。