android 定位权限_项目需求讨论之定位功能小结

9c50b4052e53d62f9c3066794d959c47.gif

点击上方蓝色字体,关注我们

  我们知道我们的APP有可能需要获取一些地理位置信息。比如定位用户当前的位置,自动选定城市或者区域等。所以这次做个关于定位的一些总结。

  我们按照二大块来进行分析:一块是相关权限,一块是具体获取地理信息的相关代码。(而实际开发代码中,代码这二块是写在一起的,单纯是为了文章分析从而分开。)

7c871e75d0330eb81939b6456aa7d020.png

1.相关权限

58bb2f5432bd774bc60f731cf687acc7.png

    这里的权限我特指了二块:

  一个是本身我们平常开发的app需要获取各种权限,比如相机等,这时候我们既然要获取当前手机的地理信息,肯定也要有一个Location相关的权限。

  本身手机需要打开相应的定位功能,不然app有权限获取,但是手机关闭了整个的定位功能,就还是获取不到。

1.1 app获取手机权限

  这块我觉得应该不需要花更多的时间来说明了吧,主要就是:

  检查权限 (checkSelfPermission)

  请求权限(requestPermissions)

  回调事件处理(onRequestPermissionsResult)而我们要申请的权限无非就是Location相关的权限。

android.permission.ACCESS_COARSE_LOCATION

允许一个程序访问CellID或WiFi热点来获取粗略的位置

android.permission.ACCESS_FINE_LOCATION

允许一个程序访问精良位置(如GPS)

   我们可以看到第一个权限中的英文单词COARSE是粗略的意思,所以在想要粗略的获取一个地理位置的时候,比如我们通过网络来获取,我们只需要申请这个权限即可;第二个权限中的英文单词FINE说明是精确度高的,比如我们需要通过GPS来获取权限的时候,我们就需要申请这个权限。

  一般来说我们的app这二个权限都会申请,因为会需要GPS配合网络一起来确定地理位置信息。

1.2 手机的定位开关

  在确定我们的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;

}

  我们可以看到上面我们提过一般来获取定位是靠GPS和NetWork二种(为啥是一般呢,因为还有一种 PASSIVE,后面会讲到)。所以我们需要判定这二个功能是否可用。(如果用户把定位功能给关了,那肯定二个都返回false。)

d7d8d2252e03f1598e6b06bf10c7a7be.png

  那这时候假如我们发现用户把定位功能关了。我们肯定需要提示用户,然后协助用户跳到该设置界面,从而让用户把定位功能打开 (毕竟一般的普通用户,可能还真的让他去设置界面找,一时半会还真找不到,毕竟安卓机型太多,每个地方都不同 )。

  比如我们弹出一个弹框,提示用户,按确定按钮的时候跳转到设置的定位界面:

AlertDialog.Builder builder  = new AlertDialog.Builder(activity);

builder.setMessage("尚未开启位置定位服务");

builder.setPositiveButton("开启", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

//启动定位Activity

Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);

//比如我们这里设定requestCode为 1

activity.startActivityForResult(intent , 1);

}

});

builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

}

});

  我们可以看到通过隐式启动Action为Settings.ACTION_LOCATION_SOURCE_SETTINGS即可,但是这里记得用使用startActivityForResult而不是startActivity,我看很多网上的的写法是用startActivity,单纯跳转过去是没问题,但是我们需要知道返回的结果,万一用户跳转过去后没有打开呢。

  既然我们用了statActivityForResult来启动,当我们返回回到自己的app界面的时候,在onActivityForResult中需要来判断,本来因为习惯性思维,所以以为自动在onActivityForResult的返回参数resultCode可以用来判断,后来发现不管开启不开启,都是返回RESULT_CANCELED,也就是0,毕竟在那个设置界面我们并没有设定setResult(xxx);所以当判断了requestCode之后,我们需要重新判断一次定位是否可用了。

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == 1) {

//我们通过上面提过的方法,再次去判断是否gps和network的provider都无效。

if (!isLocServiceEnable(MainActivity.this)) {

Toast.makeText(this, "未开启定位功能,请手动选择地址位置", Toast.LENGTH_LONG).show();

} else {

//去获取具体的地理位置信息...

}

}

}

2 .获取地理位置

  我们上面提到了我们想要获取地理位置的时候,需要具备上面的基本权限,然后才能正常使用我们的相关api去获取信息。

afb3f95b0e2ecc19e1ab4ea2839b8501.png

  主要是通过```LocationManager``这个类。

22f027c88204a09148518cd050fc55b7.png

  但是android.location包下的并不是谷歌推荐的:

7cc350282b04e8843e7bd7276b068aa2.png

  翻译过来就是:此API不是访问Android位置的推荐方法。

……

点击阅读原文查看全文

3527dc90ca166022ead7a09fdf7a4755.gif 推荐阅读

点击阅读☞如何进行需求优先级管理?

点击阅读☞需求不明确?试着讲一讲用户故事吧

点击阅读☞哪些策略可以应对不断的需求变更?

点击阅读☞有关“需求管理”的那些痛

点击阅读☞测试流程之需求评审

上文内容不用于商业目的,如涉及知识产权问题,请联系小编(021-64471599-8017)。

51977a0641ee18e778713e48ac1fda5f.gif戳好看点一下 大家都知道 cb72e03252bff89d6eafca60ae3359b2.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值