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

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

判断定位服务:

/**

* 手机是否开启位置服务,如果没有开启那么所有app将不能使用定位功能

*/

public static boolean isLocServiceEnable(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) {

return true;

}

return false;

}

判断定位权限:

/**

* 检查权限列表

*

* @param context

* @param op 这个值被hide了,去AppOpsManager类源码找,如位置权限 AppOpsManager.OP_GPS==2

* @param opString 如判断定位权限 AppOpsManager.OPSTR_FINE_LOCATION

* @return @see 如果返回值 AppOpsManagerCompat.MODE_IGNORED 表示被禁用了

*/

public static int checkOp(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 = new Class[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) {

return AppOpsManagerCompat.noteOp(context, opString, context.getApplicationInfo().uid,

context.getPackageName());

}

}

}

return -1;

}

调用时先检查权限:

/**

* 检查定位服务、权限

*/

private void checkLocationPermission() {

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_WINDOW

int 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,判断跳转页面:

/**

* 无法定位对话框

*

* @param activity 上下文

* @param state 权限状态0,未开启服务 1,未开启权限

* @return 对话框

*/

public static Dialog showLocErrorDialog(Activity activity, int state) {

Dialog locErrorDialog = new Dialog(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 = new Intent();

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();

}

}

});

return locErrorDialog;

}

Dialog样式:

@null

@android:color/transparent

true

@color/transparent

以上这篇Android判断定位功能是否可用的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值