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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值