news 2026/8/27 18:32:56

Android判断定位功能是否可用的方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android判断定位功能是否可用的方法

定位功能是否可用由定位服务和定位权限共同决定:

判断定位服务:

代码语言: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零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 18:31:37

《妃梦千年》第20章-贵妃之位

第20章 贵妃之位 淑妃死后&#xff0c;长安落了场大雪。 边报却一天比一天急。北境左贤王围青石口&#xff0c;姜横死守。就在满朝上下都揪着心的时候&#xff0c;北境来了捷报。 姜横用疑兵之计&#xff0c;夜里举火三处&#xff0c;佯装援军&#xff0c;又趁雪夜劫了北境粮道…

作者头像 李华
网站建设 2026/8/27 18:27:41

从顺序执行到条件执行:解析 if 语句

目录 1.引言 2.if语句&#xff08;if statement&#xff09; 3.缩进&#xff08;indent&#xff09;与取消缩进&#xff08;dedent&#xff09; 4.比较运算符 5.if-else结构 1.引言 在之前的几篇博客当中&#xff0c;我们讨论了很多&#xff0c;但都是关于顺序执行的&…

作者头像 李华
网站建设 2026/8/27 18:24:10

智能审查别跳过前端的确定性检查

智能审查别跳过前端的确定性检查 1. 告警群里的反打卡&#xff1a;AI 审查助手把正常组件全踢回去了 接入 LLM 代码审查后&#xff0c;常见问题是&#xff1a;正常的 useMemo 被误报为风险&#xff0c;模型给出的修复无法通过编译&#xff0c;或在同步逻辑中建议加入无意义的异…

作者头像 李华
网站建设 2026/8/27 18:23:24

野路子、没方向、晋升难?一图带你搭建产品经理的AI大模型能力

前言 如果你向20位成功的产品经理/运营询问他们的成功秘诀&#xff0c;他们可能会分享出10种、20种甚至100种不同的方法和路径&#xff0c;这正如老话所说&#xff1a;“条条大路通罗马”。 但值得注意的是&#xff0c;虽然这些路径各不相同&#xff0c;却并不一定都是最高效或…

作者头像 李华
网站建设 2026/8/27 18:20:54

2024年中国AI大模型场景探索及产业应用调研报告(附完整PDF下载)

前言 《2024年中国AI大模型场景探索及产业应用调研报告》&#xff0c;由深圳前瞻产业研究院、首钢基金CANPLUS、华为云共同出品。报告主要探讨了中国AI大模型在不同行业场景中的应用现状、痛点、解决方案以及未来的发展趋势和投资机会。报告显示&#xff0c;2023年我国AI大模型…

作者头像 李华