今天有客户使用我们的BrightBeacon SDK开发应用时,导入SDK提供的Demo并且运行,发现没有ibeacon数据返回,经过调查发现demo是运行在Android 6.0的系统上,由于Android 6.0对系统权限的授权作了更新和调整,所以没有ibeacon数据返回是系统授权问题,所以今天我们就来说说Android M(6.0) 权限问题。
自从Android M(6.0)发布以来,权限管理相比以前有了很大的改变,很多程序员发现之前运行的好好的Android应用在Android M上无法运行。本文现在把Android M中经常遇到的权限问题总结出来,并且给出相应的解决方案,分享给Android程序员兄弟们,希望给他们的开发工作带来帮助。
有一篇全面介绍Android M 运行时权限文章写的非常全面(翻译的):Android M 新的运行时权限开发者需要知道的一切,但是实施过程中还是遇到一些坑。
坑一:用Android5.0编译的apk,在Android6.0上运行完全没有问题。
在Android6.0以上才需要在运行时请求权限,在旧Android版本上保留原有逻辑,安装时授予权限。
用旧版本sdk编译的apk,都使用旧版本权限方式,安装时授予权限。(也就是说:兼容旧版本)
用Android6.0(targetSdkVersion 23)编译apk才需要处理新的权限问题。
还有一个蛋疼的问题:程序运行当中,用户关闭了权限,会发生什么?(还未知)
坑二:蓝牙扫描需要位置权限
BluetoothUtils: Permission denial: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get scan results
1. Manifest添加权限
Android6.0分了几种权限:Normal Permissions(安装时自动授权,用户也不能取消权限)(链接需要板凳) and Dangerous Permissions(链接需要板凳)
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>
2. 请求权限
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults)
坑三:Fragment请求权限
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)
坑四:WRITE_SETTINGS权限怎么处理
android.permission.WRITE_SETTINGS不能自动授权,也不能运行时请求授权,咋整啊?通过打开Intent来让用户设置。貌似SETTINGS的权限只能这么处理,from CommonsWare research Android 6.0 changes.
/**
* An app can use this method to check if it is currently allowed to write or modify system
* settings. In order to gain write access to the system settings, an app must declare the
* {@link android.Manifest.permission#WRITE_SETTINGS} permission in its manifest. If it is
* currently disallowed, it can prompt the user to grant it this capability through a
* management UI by sending an Intent with action
* {@link android.provider.Settings#ACTION_MANAGE_WRITE_SETTINGS}.
*
* @param context A context
* @return true if the calling app can write to system settings, false otherwise
*/
if(!Settings.System.canWrite(this)){
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE) { if (Settings.System.canWrite(this)) {
Toast.makeText(MainActivity.this, "WRITE_SETTINGS permission granted", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "WRITE_SETTINGS permission not granted", Toast.LENGTH_SHORT).show();
}
}
}
另外附送关于
1、Android权限模式相关帖子:http://blog.csdn.net/ahence/article/details/48156485
2、Android M 新的运行时权限开发者需要知道的一切
原文Everything every Android Developer must know about new Android’s Runtime Permission
本帖转载于http://blog.csdn.net/ylbf_dev/article/details/49506505,我是代码的搬运工,不喜勿喷。。。。