1. 簡介
從 Android 6.0(API 級別 23)開始稠屠,用戶開始在應用運行時向其授予權(quán)限霹娄,而不是在應用安裝時授予。此方法可以簡化應用安裝過程旺聚,因為用戶在安裝或更新應用時不需要授予權(quán)限。它還讓用戶可以對應用的功能進行更多控制眶蕉;例如砰粹,用戶可以選擇為相機應用提供相機訪問權(quán)限,而不提供設(shè)備位置的訪問權(quán)限造挽。用戶可以隨時進入應用的“Settings”屏幕調(diào)用權(quán)限碱璃。
2. 分析
運行時請求權(quán)限主要有3種方法:
- Google官方示例
- EasyPermissions
- PermissionsDispatcher
這里主要講Google官方示例和EasyPermissions弄痹。
3. 使用Google官方示例
官方示例是最簡單的方法,不需要添加依賴庫厘贼,只需要調(diào)用requestPermissions()方法界酒。效果圖如下圖。
代碼如下嘴秸。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= 23) {
requestPermission();
} else {
initFragment();
}
}
private void requestPermission() {
//1. 檢查是否已經(jīng)有該權(quán)限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
//2. 權(quán)限沒有開啟毁欣,請求權(quán)限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, RC_RW_EXSTORAGE);
}else{
//權(quán)限已經(jīng)開啟,做相應事情
Log.i(TAG, "requestPermission: 權(quán)限已經(jīng)開啟");
initFragment();
}
}
//3. 接收申請成功或者失敗回調(diào)
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == RC_RW_EXSTORAGE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//權(quán)限被用戶同意,做相應的事情
Log.i(TAG, "onRequestPermissionsResult: 權(quán)限被用戶同意");
initFragment();
} else {
//權(quán)限被用戶拒絕岳掐,做相應的事情
Log.i(TAG, "onRequestPermissionsResult: 權(quán)限被用戶拒絕");
onBackPressed();
}
}
}
4. 使用EasyPermissions
查看OSChina安卓客戶端的開源項目凭疮,發(fā)現(xiàn)用的是EasyPermissions,果斷試用一下EasyPermissions串述。優(yōu)點是可以方便地添加解釋對話框执解,而且可以設(shè)置回調(diào)函數(shù)。缺點是在某些自定義主題中文字顯示會有問題纲酗。效果圖如下圖衰腌。
- 添加依賴庫
dependencies {
compile 'pub.devrel:easypermissions:0.4.2'
}
- 添加接口和重寫回調(diào)函數(shù)
public class MainActivity extends BaseAppCompatActivity implements EasyPermissions.PermissionCallbacks {
private final static int RC_CONTACTS = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.myactivity_main);
requestContacts();
}
@AfterPermissionGranted(RC_CONTACTS)
private void requestContacts() {
//所要申請的權(quán)限
String perm = Manifest.permission.READ_CONTACTS;
if (EasyPermissions.hasPermissions(this, perm)) {//檢查是否獲取該權(quán)限
Log.i(TAG, "已獲取權(quán)限");
syncContactToGlass(false, firstBind);
} else {
//第二個參數(shù)是被拒絕后再次申請該權(quán)限的解釋
//第三個參數(shù)是請求碼
//第四個參數(shù)是要申請的權(quán)限
EasyPermissions.requestPermissions(this, getResources().getString(R.string.no_read_contact_permission), RC_CONTACTS, perm);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// 把申請權(quán)限的回調(diào)交由EasyPermissions處理
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
//下面兩個方法是實現(xiàn)EasyPermissions的EasyPermissions.PermissionCallbacks接口
//分別返回授權(quán)成功和失敗的權(quán)限
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
Log.i(TAG, "獲取成功的權(quán)限" + perms);
}
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
Log.i(TAG, "獲取失敗的權(quán)限" + perms);
}
}
5. 參考文檔
googlesamples/easypermissions: Simplify Android M system permissions https://github.com/googlesamples/easypermissions
在運行時請求權(quán)限 | Android Developers https://developer.android.google.cn/training/permissions/requesting.html
系統(tǒng)權(quán)限 | Android Developers https://developer.android.google.cn/guide/topics/security/permissions.html#normal-dangerous
Android開源項目-Easypermissions - 簡書 http://www.reibang.com/p/2b3661928e66
Android 6.0運行時權(quán)限的申請使用及EasyPermissions的使用 - lzy的博客 - CSDN博客 http://blog.csdn.net/lylodyf/article/details/53158091
Android基礎(chǔ)——適配安卓6.0新權(quán)限系統(tǒng) - Hensen_的博客 - CSDN博客 http://blog.csdn.net/qq_30379689/article/details/57407306