Android 6.0 运行时权限问题 open failed: EACCES (Permission denied)

Android6.0 在权限上有很大改动,它将权限分为普通权限危险权限

对于普通权限,直接在 Manifest 文件里声明即可使用;而对于危险权限,除了要在Manifest 文件里声明外,还需要在用到权限的地方,检查 APP 是否已经拥有权限,如果没有要进行申请

这里以读取手机中的照片为例

首先在 Manifest 文件中添加如下配置

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

其次要在需要的地方进行权限判断与申请

    //CameraDemoActivity 是activity的名字
    if (ContextCompat.checkSelfPermission(CameraDemoActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE ) == PackageManager.PERMISSION_GRANTED){
        //有权限的情况
           
    }else{
        //没有权限,进行权限申请
        //REQ是本次请求的辨认编号,即 requestCode
        ActivityCompat.requestPermissions(CameraDemoActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQ);
    }

注意:上述代码中 CameraDemoActivity 是 Activity 的名字;REQ是本次请求的辨认编号,即 requestCode。这两个要转换成自己项目中的 Activity 和 requestCode

申请权限后,会有一个回调函数进行处理,即在 Activity 中重写 onRequestPermissionsResult 方法

/***
   * 申请权限后的回调函数
   * @param requestCode
   * @param permissions
   * @param grantResults
   */
 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == REQ){
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
        //申请权限成功   
        }else{
        //申请权限被拒绝   
        }
    }
}

运行效果如下

普通权限列表

权限名称 权限作用
ACCESS_LOCATION_EXTRA_COMMANDS 允许应用程序访问额外的位置提供命令
ACCESS_NETWORK_STATE 允许程序访问有关GSM网络信息
ACCESS_NOTIFICATION_POLICY 允许app通知显示在状态栏
ACCESS_WIFI_STATE 允许程序访问Wi-Fi网络状态信息
BLUETOOTH 允许程序连接到已配对的蓝牙设备
BLUETOOTH_ADMIN 允许程序发现和配对蓝牙设备
BROADCAST_STICKY 允许一个程序广播常用intents
CHANGE_NETWORK_STATE 允许程序改变网络连接状态
CHANGE_WIFI_MULTICAST_STATE 打开组播功能
CHANGE_WIFI_STATE 允许程序改变Wi-Fi连接状态
DISABLE_KEYGUARD 允许程序禁用键盘锁
EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏
GET_PACKAGE_SIZE 允许一个程序获取任何package占用空间容量
INSTALL_SHORTCUT 允许在手机桌面上添加快捷方式
INTERNET 允许程序打开网络套接字
KILL_BACKGROUND_PROCESSES 允许杀掉进程
MODIFY_AUDIO_SETTINGS 允许程序修改全局音频设置
NFC 允许使用NFC
READ_SYNC_SETTINGS 允许程序读取同步设置
READ_SYNC_STATS 允许程序读取同步状态
WRITE_SYNC_SETTINGS 允许程序写入同步设置
WAKE_LOCK 允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失
VIBRATE 允许访问振动设备
USE_FINGERPRINT 允许使用指纹识别

UNINSTALL_SHORTCUT

允许卸载快捷方式
TRANSMIT_IR 允许使用设备的红外发射器

SET_WALLPAPER_HINTS

允许程序设置壁纸hits
SET_WALLPAPER 允许程序设置壁纸
SET_TIME_ZONE 允许程序设置时间区域
SET_ALARM 允许程序设置闹铃提醒
REQUEST_INSTALL_PACKAGES 允许未知应用安装权限
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 允许加入白名单(休眠和待机状态)
REORDER_TASKS 允许程序改变Z轴排列任务
RECEIVE_BOOT_COMPLETED 允许程序接收到 


 

危险权限列表

权限名称 分类 作用
RECORD_AUDIO MICROPHONE 麦克风
BODY_SENSORS SENSORS 传感器
ACCESS_COARSE_LOCATION LOCATION 位置
ACCESS_FINE_LOCATION
CAMERA CAMERA 相机
WRITE_CALENDAR CALENDAR 日历
READ_CALENDAR
PROCESS_OUTGOING_CALLS PHONE 手机
USE_SIP

ADD_VOICEMAIL

WRITE_CALL_LOG

READ_CALL_LOG
CALL_PHONE

READ_PHONE_STATE

GET_ACCOUNTS CONTACTS 联系人
WRITE_CONTACTS
READ_CONTACTS
WRITE_EXTERNAL_STORAGE STORAGE 存储卡
READ_EXTERNAL_STORAGE
RECEIVE_MMS SMS 短信
RECEIVE_WAP_PUSH
READ_SMS
RECEIVE_SMS
SEND

参考文档:

https://www.jianshu.com/p/b4a8b3d4f587

https://www.cnblogs.com/guanmanman/p/6197148.html

https://www.jianshu.com/p/31cf0cd9cbd1

https://www.jianshu.com/p/8e37e9cf20a5

https://www.cnblogs.com/kondoh/archive/2012/04/20/2459784.html

https://blog.csdn.net/xiaorenwu1206/article/details/49358433

https://blog.csdn.net/u014133119/article/details/80652188

发布了244 篇原创文章 · 获赞 109 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/wsjzzcbq/article/details/100927445