1

[https://developer.android.com...]
https://shoewann0402.github.io/2019/03/17/android-q-beta-scoped-storage/(https://developer.android.com...
permission-group
给相关的权限声明一个逻辑上的分组名称。独立的权限要通过元素的permissionGroup属性来加入权限分组。同一分组的中成员会一起展现在用户的界面中。
同一组的任何一个权限被授权了,其他权限也自动被授权。例如,一旦WRITE__CONTACTS__被授权了,__app__也有__READ__CONTACTS和GET_ACCOUNTS了。

normal:低风险权限,只要申请了就可以使用(在AndroidManifest.xml中添加<uses-permission>标签),安装时不需要用户确认;
dangerous:高风险权限,安装时需要用户的确认才可使用;
signature:只有当申请权限的应用程序的数字签名与声明此权限的应用程序的数字签名相同时(如果是申请系统权限,则需要与系统签名相同),才能将权限授给它;
signatureOrSystem:签名相同,或者申请权限的应用为系统应用(在system image中)

Dangerous Permissions:

group:com.google.android.gms.permission.CAR_INFORMATION
  permission:com.google.android.gms.permission.CAR_VENDOR_EXTENSION
  permission:com.google.android.gms.permission.CAR_MILEAGE
  permission:com.google.android.gms.permission.CAR_FUEL

group:android.permission-group.CONTACTS

group:android.permission-group.PHONE

group:android.permission-group.CALENDAR

group:android.permission-group.CALL_LOG

group:android.permission-group.CAMERA

group:android.permission-group.UNDEFINED
  permission:android.permission.READ_SMS
  permission:android.permission.READ_CALENDAR
  permission:android.permission.READ_CALL_LOG
  permission:android.permission.ACCESS_FINE_LOCATION
  permission:android.permission.ANSWER_PHONE_CALLS
  permission:android.permission.RECEIVE_WAP_PUSH
  permission:android.permission.BODY_SENSORS
  permission:android.permission.READ_PHONE_NUMBERS
  permission:android.permission.RECEIVE_MMS
  permission:android.permission.RECEIVE_SMS
  permission:android.permission.READ_EXTERNAL_STORAGE
  permission:android.permission.ACCESS_COARSE_LOCATION
  permission:android.permission.READ_PHONE_STATE
  permission:android.permission.SEND_SMS
  permission:android.permission.CALL_PHONE
  permission:android.permission.WRITE_CONTACTS
  permission:android.permission.ACCEPT_HANDOVER
  permission:android.permission.CAMERA
  permission:android.permission.WRITE_CALENDAR
  permission:android.permission.WRITE_CALL_LOG
  permission:android.permission.USE_SIP
  permission:android.permission.PROCESS_OUTGOING_CALLS
  permission:android.permission.READ_CELL_BROADCASTS
  permission:android.permission.GET_ACCOUNTS
  permission:android.permission.WRITE_EXTERNAL_STORAGE
  permission:android.permission.ACTIVITY_RECOGNITION
  permission:android.permission.RECORD_AUDIO
  permission:android.permission.READ_CONTACTS
  permission:android.permission.ACCESS_BACKGROUND_LOCATION
  permission:android.permission.ACCESS_MEDIA_LOCATION
  permission:com.android.voicemail.permission.ADD_VOICEMAIL

group:android.permission-group.ACTIVITY_RECOGNITION

group:android.permission-group.SENSORS

group:android.permission-group.LOCATION
  permission:com.google.android.gms.permission.CAR_SPEED

group:android.permission-group.STORAGE

group:com.sina.weibo.permission-group
  permission:com.sina.weibo.permission.USER

group:android.permission-group.MICROPHONE

group:android.permission-group.SMS

ungrouped:
  permission:com.huawei.hms.permission.ACTIVITY_RECOGNITION
  permission:com.google.android.providers.talk.permission.WRITE_ONLY
  permission:org.codeaurora.permission.POWER_OFF_ALARM
  permission:com.qualcomm.permission.USE_EMBMS_SERVICE
  permission:com.google.android.providers.talk.permission.READ_ONLY

动态权限适配

Normal Permission:写在xml文件里,那么App安装时就会默认获得这些权限,即使是在Android6.0系统的手机上,用户也无法在安装后动态取消这些normal权限,这和以前的权限系统是一样的,不变。

Dangerous Permission:还是得写在xml文件里,但是App安装时具体如果执行授权分以下几种情况:
1、targetSDKVersion < 23 & API(手机系统) < 6.0 :安装时默认获得权限,且用户无法在安装App之后取消权限。
3、targetSDKVersion < 23 & API(手机系统) >= 6.0 :安装时默认获得权限,但是用户可以在安装App完成后动态取消授权( 取消时手机会弹出提醒,告诉用户这个是为旧版手机打造的应用,让用户谨慎操作 )。

2、targetSDKVersion >= 23 & API(手机系统) < 6.0 :安装时默认获得权限,且用户无法在安装App之后取消权限。

4、targetSDKVersion >= 23 & API(手机系统) >= 6.0 :安装时不会获得权限,可以在运行时向用户申请权限。用户授权以后仍然可以在设置界面中取消授权,用户主动在设置界面取消后,在app运行过程中可能会出现crash

申请权限一般通过代理的Activity申请
代理Activity
requestPermissions申请
onRequestPermissionResult 接收结果并回调

// 基础判断权限方法
public abstract int checkPermission(@NonNull String permission, int pid, int uid);

// 当前进程内判断权限的方法,如果在IPC内,直接返回FAIL
public abstract int checkCallingPermission(@NonNull String permission);

// IPC内判断权限的方法
public abstract int checkSelfPermission(@NonNull String permission);

// 上面两种方法的结合,只想判断当前进程内权限,不要使用这个方法,会有安全性问题
public abstract int checkCallingOrSelfPermission(@NonNull String permission);

// 判断是否可以弹窗
public boolean shouldShowRequestPermissionRationale(@NonNull String permission) {

自定义权限

<permission 
    android:description="string resource"
    android:icon="drawable resource"
    android:label="string resource"
    android:name="string"
    android:permissionGroup="string"
    android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] />
    
<activity
    android:name="com.example.testandroid.BActivity"
    android:exported="true"
    android:label="B"
    android:permission="corn.permission.CORN\_OWN" />

程浩
21 声望2 粉丝