標籤:data 相容 build main generated shm 平台 sage 自動產生
PermissionsDispatcher2.3.2使用
Android6.0許可權官網
https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html?hl=zh-cn
系統許可權:
https://developer.android.com/training/permissions/index.html?hl=zh-cn
許可權的最佳做法:
https://developer.android.com/training/permissions/best-practices.html?hl=zh-cn#testing
該庫的github地址
https://github.com/hotchemi/PermissionsDispatcher
許可權Gradle配置
使用PermissionsDispatcher,需要在project的 build.gradle中添加
(1)當Studio的版本在2.2之上
在app module中的build.gradle中添加:
dependencies { compile ‘com.github.hotchemi:permissionsdispatcher:${latest.version}‘ annotationProcessor ‘com.github.hotchemi:permissionsdispatcher-processor:${latest.version}‘}
目前${latest.version}
最新的是2.3.2。
(2)當Studio的版低於2.2
在工程目錄下build.gradle 檔案中添加:
buildscript { dependencies { classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8‘ } }
然後在app module中的build.gradle中添加:(必須在app module中添加)
apply plugin: ‘android-apt‘ dependencies { compile ‘com.github.hotchemi:permissionsdispatcher:${latest.version}‘ apt ‘com.github.hotchemi:permissionsdispatcher-processor:${latest.version}‘ }
用法:1.註解
PermissionsDispatcher只介紹幾個註解,保持其通用API簡潔:
註:帶注釋的方法一定不能private。
註解 |
需要 |
描述 |
@RuntimePermissions |
? |
在Activity或者Fragment中需要添加,來處理許可權的問題 |
@NeedsPermission |
? |
注釋其執行需要一個或多個許可的作用的方法(當使用者授予了許可權之後,會調用使用此註解的方法) |
@OnShowRationale |
|
注釋這解釋了為什麼需要許可/秒/方法。它通過在一個PermissionRequest可用於繼續或中止在使用者輸入的當前的許可請求對象 |
@OnPermissionDenied |
|
注釋這是調用的方法,如果使用者不授與權限 |
@OnNeverAskAgain |
|
注釋如果使用者選擇讓裝置“不再詢問”有關許可被調用的方法 |
具體使用如下:
@RuntimePermissionspublic class MainActivity extends AppCompatActivity { @NeedsPermission(Manifest.permission.CAMERA) void showCamera() { getSupportFragmentManager().beginTransaction() .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance()) .addToBackStack("camera") .commitAllowingStateLoss(); } @OnShowRationale(Manifest.permission.CAMERA) void showRationaleForCamera(final PermissionRequest request) { new AlertDialog.Builder(this) .setMessage(R.string.permission_camera_rationale) .setPositiveButton(R.string.button_allow, (dialog, button) -> request.proceed()) .setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel()) .show(); } @OnPermissionDenied(Manifest.permission.CAMERA) void showDeniedForCamera() { Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show(); } @OnNeverAskAgain(Manifest.permission.CAMERA) void showNeverAskForCamera() { Toast.makeText(this, R.string.permission_camera_neverask, Toast.LENGTH_SHORT).show(); }}
2.自動產生的類
Activity繼承了AppCompatActivity,是的,如果使用PermissionsDispatcher進行許可權管理,那麼Activity就要繼承AppCompatActivity。這就要使用到了相容包裡的類了。同樣此時相應Activity中使用的主題,也需要進行修改,修改成相應相容包裡的主題。
在編譯時間,PermissionsDispatcher產生的一類MainActivityPermissionsDispatcher([活動名稱] + PermissionsDispatcher),您可以使用安全地訪問這些許可保護的方法。
MainActivityPermissionsDispatcher需要自己編譯才會有:
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button_camera).setOnClickListener(v -> { // NOTE: delegate the permission handling to generated method MainActivityPermissionsDispatcher.showCameraWithCheck(this); }); findViewById(R.id.button_contacts).setOnClickListener(v -> { // NOTE: delegate the permission handling to generated method MainActivityPermissionsDispatcher.showContactsWithCheck(this); });}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // NOTE: delegate the permission handling to generated method MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);}
添加SDK支援版本的兩種方式:
@RuntimePermissionspublic class MainActivity extends AppCompatActivity { @NeedsPermission(value = Manifest.permission.WRITE_EXTERNAL_STORAGE, maxSdkVersion = 18) void getStorage() { // ... }}
使用步驟:一、在Manifest中添加許可權
<uses-permission android:name="android.permission.CAMERA" />
二、在Activity中添加註解
@RuntimePermissionspublic class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); } /** * 顯示相機許可權 */ @NeedsPermission(Manifest.permission.CAMERA) void showCamera() {//處理當使用者允許該許可權時需要處理的方法 getSupportFragmentManager().beginTransaction() .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance()) .addToBackStack("camera") .commitAllowingStateLoss(); } @OnShowRationale(Manifest.permission.CAMERA) void showRationaleForCamera(final PermissionRequest request) {// 提示使用者權限使用的對話方塊 new AlertDialog .Builder(this) .setMessage("是否開啟許可權") .setPositiveButton("允許", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { request.proceed(); } }) .setNegativeButton("拒絕", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { request.cancel(); } }) .show(); } /** * 如果使用者拒絕該許可權執行的方法 */ @OnPermissionDenied(Manifest.permission.CAMERA) void showDeniedForCamera() { Toast.makeText(this, "擷取許可權失敗", Toast.LENGTH_SHORT).show(); } @OnNeverAskAgain(Manifest.permission.CAMERA) void showNeverAskForCamera() { Toast.makeText(this, "再次擷取許可權", Toast.LENGTH_SHORT).show(); }
三、重寫回調方法,並且使用MainActivityPermissionsDispatcher(此方法編譯產生【Activity】+PermissionsDispatcher)
/** * 許可權請求回調,提示使用者之後,使用者點擊“允許”或者“拒絕”之後調用此方法 * * @param requestCode 定義的許可權編碼 * @param permissions 許可權名稱 * @param grantResults 允許/拒絕 */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults); } @OnClick({R.id.button_camera, R.id.button_contacts}) public void onClick(View view) { switch (view.getId()) { case R.id.button_camera:// show(this, "相機");// 預設是沒有此類的,需要編譯下才會有此類 MainActivityPermissionsDispatcher.showCameraWithCheck(this); break; } }
注意
- 使用到的許可權需要在Mnifest裡面註冊
- PermissionsDispatcher依賴於support-v4由預設庫,以便能夠使用一些許可權compat的類。
- 需要添加support-v13庫一起PermissionsDispatcher在您的項目,它將使原生片段支援
原生6.0許可權使用Android 6.0 變更
另請參閱
Android 6.0 API 概覽
Android 6.0(API 層級 23)除了提供諸多新特性和功能外,還對系統和 API 行為做出了各種變更。
如果您之前發布過 Android 應用,請注意您的應用可能受到這些平台變更的影響。
運行時許可權
此版本引入了一種新的許可權模式,如今,使用者可直接在運行時管理應用許可權。這種模式讓使用者能夠更好地瞭解和控制許可權,同時為應用開發人員精簡了安裝和自動更新過程。使用者可為所安裝的各個應用分別授予或撤銷許可權。
對於以 Android 6.0(API 層級 23)或更高版本為目標平台的應用,請務必在運行時檢查和請求許可權。要確定您的應用是否已被授予許可權,請調用新增的 checkSelfPermission()
方法。要請求許可權,請調用新增的 requestPermissions()
方法。即使您的應用並不以 Android 6.0(API 層級 23)為目標平台,您也應該在新許可權模式下測試您的應用。
使用步驟1、在AndroidManifest檔案中添加需要的許可權。
這個步驟和我們之前的開發並沒有什麼變化,試圖去申請一個沒有聲明的許可權可能會導致程式崩潰。
2、檢查許可權
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {}else{ //}
這裡涉及到一個API,ContextCompat.checkSelfPermission,主要用於檢測某個許可權是否已經被授予,方法傳回值為PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。當返回DENIED就需要進行申請授權了。
3、申請授權
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
該方法是非同步,第一個參數是Context;第二個參數是需要申請的許可權的字串數組;第三個參數為requestCode,主要用於回調的時候檢測。可以從方法名requestPermissions以及第二個參數看出,是支援一次性申請多個許可權的,系統會通過對話方塊逐一詢問使用者是否授權。
4、處理許可權申請回調
@Overridepublic void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // contacts-related task you need to do. } else { // permission denied, boo! Disable the // functionality that depends on this permission. } return; } }}
首先驗證requestCode定位到你的申請,然後驗證grantResults對應於申請的結果,這裡的數組對應於申請時的第二個許可權字串數組。如果你同時申請兩個許可權,那麼grantResults的length就為2,分別記錄你兩個許可權的申請結果。如果申請成功,就可以做你的事情了~
具體使用詳見demo,GitHub:https://github.com/huangshuyuan/PermissionsDispatcherDemo
參考文檔:http://blog.csdn.net/lmj623565791/article/details/50709663
流水潺湲
連結:http://www.jianshu.com/p/d299f22dfbdb
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。補充
現在網上不少關於許可權的庫,可以直接用的,在GitHub上搜尋即可
https://github.com/search?o=desc&q=android+permission&s=stars&type=Repositories&utf8=%E2%9C%93
Android許可權管理PermissionsDispatcher2.3.2使用+原生6.0許可權使用