Android6.0权限问题

Google I/O 2015大会上,谷歌推出了棉花糖,时至今日,Android6.0手机也越来越普及了,而作为程序员的我们在开发中不得不面对的一个问题就是权限问题。此次6.0的发布,Google推出了新的权限机制来保护用户的隐私,将权限分为两类:
Normal Permisssion:一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;
Dangerous Permission:一般是涉及到用户隐私的,需要用户进行授权,比如读取sdcard、访问通讯录等
常见的权限:
Normal Permisssion:
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS

Dangerous Permission:
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS

group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL

group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR

group:android.permission-group.CAMERA
permission:android.permission.CAMERA

group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS

group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO

group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS
详细可以通过adb shell pm list permission -d -g进行查看
可以看出,Dangerous Permission都是一组一组的,那么分组对我们的权限机制有什么影响呢?
必然是有影响的,当我们的app运行在6.X的机型上时,如果app已经被授权了危险权限组中的某一个权限,那么在申请该组另一个权限时,系统会直接授权通过,比如当我们的app已经对READ_SMS授权通过了,那么app在申请SEND_SMS权限时会直接通过。此外,对于申请授权时弹出的dialog提示,上面的文本说明也是针对于整个权限组的说明,而不是针对单个。不过我们在申请权限的时候最好尽可能对每一个危险权限进行正常流程的申请,不要过于依赖权限组,因为在后期的版本中,这个组可能会发生变化。
那么在碰到6.X的机型时,我们的app申请权限的流程应该是:
1.在AndroidManifest文件中添加需要的权限;
2.检查权限

if(ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
}else{}

方法checkSelfPermission()主要是用来检验某个权限是否已经被授权了,方法的返回值为PackageManager.PERMISSION_GRANTED和PackageManager.PERMISSION_DENIED,当返回为PERMISSION_DENIED时就需要授权了;
3.申请授权

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},200);

该方法是异步的,第一个参数是Context,第二个参数是需要申请的权限的字符串数组,第三个参数是requestCode,主要用于回调的时候检测的;
4.处理权限申请回调

public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 200) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager
.PERMISSION_GRANTED && grantResults[2] == PackageManager.PERMISSION_GRANTED) {
            //申请权限通过,执行该执行的任务

} else {
           //申请权限遭拒
}
    } else {
        //返回码不匹配
}
}

这里的grantResults分别记录着你申请权限的个数,如果都通过,我们再执行该执行的任务,只要有其中某种没有通过极有可能造成我们的app出问题。
至此我们申请权限的步骤就差不多走完了,但还有个值得注意的方法:

if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_EXTERNAL_STORAGE)){
    //你需要在这里给用户一个申请权限的解释
}

该方法只有在用户上一次已经拒绝过这个权限申请。也就是说,用户已经拒绝一次了,你又弹个授权框,你需要给用户一个解释,为什么要授权,则使用该方法。该方法一般放在check里面。

最后奉上一个仿微信语音聊天的项目,该项目是我参照HongYang大神的视频写的(在此感谢HongYang大神的资源分享),并解决了Android6.0上无法录制语音的问题,希望对大家有所帮助!
项目下载地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值