|
|
第26行: |
第26行: |
| | | |
| 对于Eclipse环境,请更改AndroidManifest.xml中代码;AndroidStudio环境,请更改build.gradle中的代码。 | | 对于Eclipse环境,请更改AndroidManifest.xml中代码;AndroidStudio环境,请更改build.gradle中的代码。 |
− | <div class="bluetitle"><div class="services-title-text">动态权限代码样例</div></div>
| |
− | 在Android 6.0系统中,需要动态获取的权限涉及到:
| |
| | | |
− |
| |
− |
| |
− | 1. 获取位置信息:
| |
− | <pre class="prettyprint codestyle">
| |
− | Manifest.permission.ACCESS_COARSE_LOCATION;
| |
− | Manifest.permission.ACCESS_FINE_LOCATION;
| |
− | </pre>
| |
− |
| |
− | 2. 读写SD卡:
| |
− | <pre class="prettyprint codestyle">
| |
− | Manifest.permission.READ_EXTERNAL_STORAGE;
| |
− | Manifest.permission.WRITE_EXTERNAL_STORAGE;
| |
− | </pre>
| |
− |
| |
− | <div class="bluetitle"><div class="services-title-text">获取权限使用API</div></div>
| |
− | <div class="devguide">
| |
− | <div class="leftborderbg" style="height:400px;"></div>
| |
− | <div class="devguideorder"><span>1</span>第一步,利用Context.checkSelfPermission接口,触发系统弹窗</div>
| |
− | <div class="devguidecenter">int android.content.Context.checkSelfPermission(String permission),此接口会触发系统弹窗,用户选择后触发Activity中的回调函数,以READ_PHONE_STATE为例:
| |
− | <pre class="prettyprint codestyle">
| |
− | private static final int BAIDU_READ_PHONE_STATE =100;
| |
− | </pre></div>
| |
− | <div class="devguideorder"><span>2</span>第二步,定义权限获取码,申请权限</div>
| |
− | <div class="devguidecenter">自定义一个权限获取码,用于回调函数中做对应处理,调用checkSelfPermission接口申请权限:
| |
− | <pre class="prettyprint codestyle">
| |
− | if(mContext.checkSelfPermission(Manifest.permission.READ_PHONE_STATE)!=PackageManager.PERMISSION_GRANTED) {
| |
− | // 申请一个(或多个)权限,并提供用于回调返回的获取码(用户定义)
| |
− | requestPermissions( new String[]{ Manifest.permission.READ_PHONE_STATE },BAIDU_READ_PHONE_STATE );
| |
− | }
| |
− | </pre></div>
| |
− | <div class="devguideorder"><span>3</span>第三步,处理回调函数</div>
| |
− | <div class="devguidecenter">在Activity的onRequestPermissionResult回调函数中做处理:
| |
− | <pre class="prettyprint codestyle">
| |
− | @Override
| |
− | public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults) {
| |
− | super.onRequestPermissionsResult(requestCode, permissions,grantResults);
| |
− | switch(requestCode) {
| |
− | //requestCode即所声明的权限获取码,在checkSelfPermission时传入
| |
− | case 1:
| |
− | BAIDU_READ_PHONE_STATE:
| |
− | if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
| |
− | //获取到权限,做相应处理
| |
− | //调用定位SDK应确保相关权限均被授权,否则会引起定位失败
| |
− | } else{
| |
− | //没有获取到权限,做特殊处理
| |
− | }
| |
− | break;
| |
− | default:
| |
− | break;
| |
− | }
| |
− | }
| |
− | </pre>
| |
− | </div></div>
| |
| <div class="bluetitle"><div class="services-title-text">Android 6.0系统的位置开关</div></div> | | <div class="bluetitle"><div class="services-title-text">Android 6.0系统的位置开关</div></div> |
| Android 6.0原生系统与部分厂商定制的6.0系统在系统定位开关表现上稍有差异。具体来讲,区别如下: | | Android 6.0原生系统与部分厂商定制的6.0系统在系统定位开关表现上稍有差异。具体来讲,区别如下: |
2019年7月23日 (二) 19:34的版本
Google在Android 6.0中引入了动态权限获取机制(Runtime Permission),使得Android的权限管理更加严格完善。
动态权限获取要求开发者在调用涉及相关权限的代码时,使用系统接口来动态得申请相应权限。定位SDK涉及权限即在此范畴中。
在未获取到定位权限情况下,定位SDK获取到的定位依据(基站、WI-FI)均为空值,因此无法有效定位,定位服务会返回错误码167。
Android 6.0对于动态权限机制的开启,主要根据应用所设定的targetSdkVersion,具体情况如下:
targetSdkVersion
|
是否默认禁用敏感权限
|
是否开启动态权限
|
<23
|
否
|
否
|
>=23
|
是
|
是
|
因此需要在项目配置文件中修改您的targetSdkVersion配置。
对于Eclipse环境,请更改AndroidManifest.xml中代码;AndroidStudio环境,请更改build.gradle中的代码。
Android 6.0原生系统与部分厂商定制的6.0系统在系统定位开关表现上稍有差异。具体来讲,区别如下:
系统
|
开关名称
|
对定位的影响
|
原生系统 (也包括未进行定制的系统)
|
位置信息
|
原生系统下,位置开关控制影响到系统级的GPS及网络定位: a. 在关闭位置开关情况下,应用无法获取到WiFi信息,也无法使用GPS,仅可使用基站定位(cl类型),造成定位误差变大; b. 打开位置开关后,应用可以使用WiFi信息或GPS进行定位,会大幅提升定位精度。
|
第三方、厂商定制系统
|
GPS
|
厂商定制系统(部分)开关仅影响GPS使用: a. 关闭GPS开关情况下,应用仍可访问到WiFi信息,可以使用WiFi定位; b. 打开GPS开关情况下,应用才可以使用GPS定位。
|
注意:
1. 关于原生系统定位开关会影响WiFi获取的问题,开发者可自行从网络中寻找相关说明。
这是Android6.0原生系统已知问题,需要Google修复;
厂商定制ROM表现会有所差异。(开发者可自行从网络中寻找相关说明)
2. 部分早期Android6.0版存在位置开关关闭后无法定位的问题,目前测试最新的Android6.0版本原生系统,已不存在此问题。
针对6.0系统的位置开关问题。由于GPS设置的行为在各版本中一致,因此可以简单的使用系统API来判断用户是否打开了位置按钮,让检测到系统版本为6.0,并且用户未打开按钮时,进行提示。
LocationManager locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
if(!locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
// 未打开位置开关,可能导致定位失败或定位不准,提示用户或做相应处理
}