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判断定位功能是否可用的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。