Android許可權管理PermissionsDispatcher2.3.2使用+原生6.0許可權使用

來源:互聯網
上載者:User

標籤: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支援版本的兩種方式:
  • 1、AndroidManifest
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
  • 2、在註解的時候添加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許可權使用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.