定位功能是否可用由定位服务和定位权限共同决定:
判断定位服务:
代码语言:javascript
/** * 手机是否开启位置服务,如果没有开启那么所有app将不能使用定位功能 */publicstaticbooleanisLocServiceEnable(Context context){LocationManager locationManager=(LocationManager)context.getSystemService(Context.LOCATION_SERVICE);boolean gps=locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);boolean network=locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);if(gps||network){returntrue;}returnfalse;}判断定位权限:
代码语言:javascript
/** * 检查权限列表 * * @param context * @param op 这个值被hide了,去AppOpsManager类源码找,如位置权限 AppOpsManager.OP_GPS==2 * @param opString 如判断定位权限 AppOpsManager.OPSTR_FINE_LOCATION * @return @see 如果返回值 AppOpsManagerCompat.MODE_IGNORED 表示被禁用了 */publicstaticintcheckOp(Context context,int op,String opString){final int version=Build.VERSION.SDK_INT;if(version=19){Object object=context.getSystemService(Context.APP_OPS_SERVICE);// Object object = context.getSystemService("appops");Class c=object.getClass();try{Class[]cArg=newClass[3];cArg[0]=int.class;cArg[1]=int.class;cArg[2]=String.class;Method lMethod=c.getDeclaredMethod("checkOp",cArg);return(Integer)lMethod.invoke(object,op,Binder.getCallingUid(),context.getPackageName());}catch(Exception e){e.printStackTrace();if(Build.VERSION.SDK_INT=23){returnAppOpsManagerCompat.noteOp(context,opString,context.getApplicationInfo().uid,context.getPackageName());}}}return-1;}调用时先检查权限:
代码语言:javascript
/** * 检查定位服务、权限 */privatevoidcheckLocationPermission(){if(!AppUtil.isLocServiceEnable(this)){//检测是否开启定位服务if(netErrorDialog==null||!netErrorDialog.isShowing()){locErrorDialog=DialogUtil.showLocErrorDialog(activity,0);}}else{//检测用户是否将当前应用的定位权限拒绝int checkResult=AppUtil.checkOp(this,2,AppOpsManager.OPSTR_FINE_LOCATION);//其中2代表AppOpsManager.OP_GPS,如果要判断悬浮框权限,第二个参数需换成24即AppOpsManager。OP_SYSTEM_ALERT_WINDOW及,第三个参数需要换成AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOWint checkResult2=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,判断跳转页面:
代码语言:javascript
/** * 无法定位对话框 * * @param activity 上下文 * @param state 权限状态0,未开启服务 1,未开启权限 * @return 对话框 */publicstaticDialogshowLocErrorDialog(Activity activity,int state){Dialog locErrorDialog=newDialog(activity,R.style.MyDialog);View contentView=View.inflate(activity,R.layout.dialog_tip_error_loc,null);locErrorDialog.setContentView(contentView);locErrorDialog.setCanceledOnTouchOutside(true);locErrorDialog.show();TextView checkNetCancel=contentView.findViewById(R.id.tv_submit_no);TextView checkNet=contentView.findViewById(R.id.tv_submit_yes);checkNetCancel.setOnClickListener(view-{locErrorDialog.dismiss();});checkNet.setOnClickListener(view-{locErrorDialog.dismiss();Intent intent=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(ActivityNotFoundException ex){//如果页面无法打开,进入设置页面intent.setAction(Settings.ACTION_SETTINGS);try{activity.startActivity(intent);}catch(Exception e){e.printStackTrace();}}});returnlocErrorDialog;}Dialog样式:
代码语言:javascript
<style name="MyDialog"parent="@android:style/Theme.Dialog"<item name="android:windowFrame"@null</item<item name="android:windowBackground"@android:color/transparent</item<item name="android:windowNoTitle"true</item<item name="android:background"@color/transparent</item</style以上这篇Android判断定位功能是否可用的方法就是小编分享给大家的全部内容了,希望能给大家一个参考。
更多Android进阶指南 可以扫码 解锁《Android十大板块文档》
1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2024最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路
敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔