Android 6.0動態許可權框架EasyPermissions的使用
阿新 • • 發佈:2019-01-11
在6.0下新的許可權機制分為兩類,Normal Permissions,這類許可權是不需要使用者授權,不會觸及使用者的隱私,只需要在manefest裡面申請即可;還有一類是Dangerous Permissions,這類許可權需要動態的去申請。
Normal Permission如下:
[java] view plain copy print?- android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
- android.permission.ACCESS_NETWORK_STATE
- android.permission.ACCESS_NOTIFICATION_POLICY
- android.permission.ACCESS_WIFI_STATE
- android.permission.ACCESS_WIMAX_STATE
- android.permission.BLUETOOTH
- android.permission.BLUETOOTH_ADMIN
- android.permission.BROADCAST_STICKY
- android.permission.CHANGE_NETWORK_STATE
- android.permission.CHANGE_WIFI_MULTICAST_STATE
- android.permission.CHANGE_WIFI_STATE
- android.permission.CHANGE_WIMAX_STATE
- android.permission.DISABLE_KEYGUARD
- android.permission.EXPAND_STATUS_BAR
- android.permission.FLASHLIGHT
- android.permission.GET_ACCOUNTS
- android.permission.GET_PACKAGE_SIZE
- android.permission.INTERNET
- android.permission.KILL_BACKGROUND_PROCESSES
- android.permission.MODIFY_AUDIO_SETTINGS
- android.permission.NFC
- android.permission.READ_SYNC_SETTINGS
- android.permission.READ_SYNC_STATS
- android.permission.RECEIVE_BOOT_COMPLETED
- android.permission.REORDER_TASKS
- android.permission.REQUEST_INSTALL_PACKAGES
- android.permission.SET_TIME_ZONE
- android.permission.SET_WALLPAPER
- android.permission.SET_WALLPAPER_HINTS
- android.permission.SUBSCRIBED_FEEDS_READ
- android.permission.TRANSMIT_IR
- android.permission.USE_FINGERPRINT
- android.permission.VIBRATE
- android.permission.WAKE_LOCK
- android.permission.WRITE_SYNC_SETTINGS
- com.android.alarm.permission.SET_ALARM
- com.android.launcher.permission.INSTALL_SHORTCUT
- com.android.launcher.permission.UNINSTALL_SHORTCUT
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
Dangerous Permissions:
[java] view plain copy print?- 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
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
可以看到Dangerous Permissions是按照組來分類的,如果申請了一組的其中一個許可權,那麼預設會獲得該組的所有許可權的使用。
申請的流程
1.在AndroidManifest裡面配置需要的許可權,無論是普通的還是特殊的許可權都需要在這裡配置。
2.檢查許可權,如果沒有許可權則申請
3.給使用者申請許可權的解釋,這個方法只會在第一次使用者拒絕授權,再次去申請這個的許可權時會用到
4.申請相應的許可權
5.處理申請許可權的回撥,在這裡獲得哪些授權成功哪些失敗,處理需要的邏輯
具體的例子
下面的例子是獲取使用者的寫外部儲存器和打電話的許可權
[java] view plain copy print?- publicclass Main2Activity extends AppCompatActivity {
- @Override
- protectedvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main2);
- if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)
- != PackageManager.PERMISSION_GRANTED) {//未獲取許可權
- if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)) {
- //當用戶第一次申請拒絕時,再次申請該許可權呼叫
- Toast.makeText(this, “撥打電話許可權”, Toast.LENGTH_SHORT).show();
- }
- //申請許可權
- ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 0x01);
- } else {//已經獲得了許可權
- call();
- }
- }
- privatevoid call() {
- Toast.makeText(this, “打電話”, Toast.LENGTH_SHORT).show();
- }
- @Override
- publicvoid onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNullint[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- if (requestCode == 0x01) {
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//授權成功
- call();
- } else {//授權失敗
- Toast.makeText(this, “獲取許可權失敗”, Toast.LENGTH_SHORT).show();
- }
- }
- }
- }
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED) {//未獲取許可權
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)) {
//當用戶第一次申請拒絕時,再次申請該許可權呼叫
Toast.makeText(this, "撥打電話許可權", Toast.LENGTH_SHORT).show();
}
//申請許可權
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 0x01);
} else {//已經獲得了許可權
call();
}
}
private void call() {
Toast.makeText(this, "打電話", Toast.LENGTH_SHORT).show();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 0x01) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//授權成功
call();
} else {//授權失敗
Toast.makeText(this, "獲取許可權失敗", Toast.LENGTH_SHORT).show();
}
}
}
}
封裝的三方庫——EasyPermissions
這個用於許可權的申請,使用起來十分的簡單
匯入
[java] view plain copy print?- compile ‘pub.devrel:easypermissions:0.1.5’
compile 'pub.devrel:easypermissions:0.1.5'
使用很簡單,程式碼中都有註釋,都能看懂
[java] view plain copy print?- publicclass MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {
- privatestaticfinal String TAG = “lzy”;
- @Override
- protectedvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //所要申請的許可權
- String[] perms = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CALL_PHONE};
- if (EasyPermissions.hasPermissions(this, perms)) {//檢查是否獲取該許可權
- Log.i(TAG, ”已獲取許可權”);
- } else {
- //第二個引數是被拒絕後再次申請該許可權的解釋
- //第三個引數是請求碼
- //第四個引數是要申請的許可權
- EasyPermissions.requestPermissions(this, “必要的許可權”, 0, perms);
- }
- }
- @Override
- publicvoid onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNullint[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- //把申請許可權的回撥交由EasyPermissions處理
- EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
- }
- //下面兩個方法是實現EasyPermissions的EasyPermissions.PermissionCallbacks介面
- //分別返回授權成功和失敗的許可權
- @Override
- publicvoid onPermissionsGranted(int requestCode, List<String> perms) {
- Log.i(TAG, ”獲取成功的許可權” + perms);
- }
- @Override
- publicvoid onPermissionsDenied(int requestCode, List<String> perms) {
- Log.i(TAG, ”獲取失敗的許可權” + perms);
- }
- }
public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {
private static final String TAG = "lzy";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//所要申請的許可權
String[] perms = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CALL_PHONE};
if (EasyPermissions.hasPermissions(this, perms)) {//檢查是否獲取該許可權
Log.i(TAG, "已獲取許可權");
} else {
//第二個引數是被拒絕後再次申請該許可權的解釋
//第三個引數是請求碼
//第四個引數是要申請的許可權
EasyPermissions.requestPermissions(this, "必要的許可權", 0, perms);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//把申請許可權的回撥交由EasyPermissions處理
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
//下面兩個方法是實現EasyPermissions的EasyPermissions.PermissionCallbacks介面
//分別返回授權成功和失敗的許可權
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
Log.i(TAG, "獲取成功的許可權" + perms);
}
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
Log.i(TAG, "獲取失敗的許可權" + perms);
}
}