您的当前位置:首页正文

安卓进阶第七篇之6.0权限适配问题

来源:华拓网

Android M已经出来很久了,特别是从6.0开始增加了运行时权限RuntimePermission。如果你的项目targetSdkVersion支持到22以上(>=23),那就必须做权限适配,否侧app就会报权限错误,如果想app不报错,只需设置targetSdkVersion<=22,不过这也不是长久之计,权限适配迟早是要做的。

普通权限如下:

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

危险权限如下:

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

我们可以看到,危险权限都是一组一组的,那么这对我们申请权限有什么影响呢?简单点说,如果你申请某一个组的权限(假如说这个组下有两个权限A和B),如果弹出的授权dialog你授予了A权限,但是拒绝了B权限,那么下次再次点击获取授权的时候,因为你已经授权了这个组下的A权限,那么系统会认为你已经授权了这个组下的所有权限,所以不再会弹出授权权限B的dialog。所以我们在申请授权的时候,尽量不要去使用申请组的权限,而是对每个危险权限进行正常的申请。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout    

android:id="@+id/activity_main"    
android:layout_width="match_parent"    
android:layout_height="match_parent"   >    
   <Button        
     android:text="打电话"        
    android:id="@+id/call_phone_btn"        
    android:layout_width="match_parent"        
    android:layout_height="45dp"/>
</RelativeLayout>

再来看看是怎么调用权限的:

@Override
public void onClick(View v) {    
     switch (v.getId()){        
     case R.id.call_phone_btn:                  
        PermissionGen.needPermission(MainActivity.this,100,Manifest.permission.CALL_PHONE);            
     break;    
 }}

第二个参数100,就是我们请求的requestCode,第三个参数就是要请求的权限,再看看请求结果的返回:

@PermissionSuccess(requestCode = 100)
private void doCallPhoneSuccess() {    
    Toast.makeText(MainActivity.this, "请求授权成功", Toast.LENGTH_LONG).show();
}
@PermissionFail(requestCode = 100)
private void doCallPhoneError() {    
    Toast.makeText(MainActivity.this, "请求授权失败", Toast.LENGTH_LONG).show();
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    
     PermissionGen.onRequestPermissionsResult(MainActivity.this, requestCode, permissions, grantResults);
}

个人觉得作者已经封装的很好了,用起来很方便,也可以满足我们项目中的需求。(没什么技术含量,就当是自己的一个笔记吧。)