Android 6.0中的运行时权限控制

写了段代码, 无论如何无法正常执行:

File dir = Environment.getExternalStorageDirectory();
...
File[] children = dir.listFiles(); // children取出来是null

然后加了判断, 发现dir不可读:

File dir = Environment.getExternalStorageDirectory();
...
if (dir.canRead()) { // dir不可读
    File[] children = dir.listFiles();    ...
}

难道是没有在manifest注册权限? 不, 明明有WRITE_EXTERNAL_STORAGE...

然后放弃思考玩了局游戏, 回来想通了——这机器是Android 6.0版本, 除了manifest的权限, 还有个运行时权限(Requesting Permissions at Run Time). // 玩游戏果然醒脑

直接用代码说话:

1. 检查是否已经被赋予了相应的权限:

int result = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); // 这是Context的方法

注意result是个int值, 从PackageManager.PERMISSION_GRANTED和PackageManager.PERMISSION_DENIED中取值.

2. 若未获取权限, 则申请权限:

final String[] permissionsToRequest = { Manifest.permission.WRITE_EXTERNAL_STORAGE };
final int requestCode = 0;
requestPermissions(permissionsToRequest, requestCode); // 这是Activity的方法

上述代码执行后, 系统会弹出Dialog, 提示用户查看权限申请.

3. 用户操作完毕, 以下Activity方法将被回调:

public void onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)

在其中, 针对requestCode处理好即可.

4. 补充:

官方文档推荐在申请权限前, 考虑是否需要针对权限申请, 向用户作出说明(比如说本游戏为毛要读您的联系人). 同时Activity提供了这个接口的原型:

public boolean shouldShowRequestPermissionRationale (String permission)

猜你喜欢

转载自oliveexcel.iteye.com/blog/2289950