寫Android 6的危險權限很累嗎? 第三方好物PermissionsDispatcher

寫Android 6的危險權限很累嗎? 第三方好物PermissionsDispatcher

Android 6.0以後的權限設計讓Android工程師們傷透腦筋,邁進Android Oreo的今日仍有不少專案疏於維護,近一年來因Google 上架權限審核加嚴而不得不修改危險權限動態授權設計。也因動態授權機制繁雜,不少第三方類別庫因應而生。

這篇將介紹頗受歡迎的第三方類別庫,PermissionsDispatcher 

在開始前,請先確實了解Android 6.0的Permission權限設計,為什麼Android 6.0要分成一般權限和危險權限、何謂危險權限、如何執行中取得使用者授權等,畢竟所有的第三方類別庫都是以Google Android原生API為基礎,架構在原生API上的。

PermissionsDispatcher

PermissionsDispatcher之所以受歡迎,除了簡單易用,最大原因應該是強大的IntelliJ plugin ,畢竟滑鼠點一點就能長出程式碼乃懶人極品。

準備工作

1. Install PermissionsDispatcher Plugin

先安裝PermissionsDispatcher Plugin,才能透過此工具自動產生要求使用者動態授權的程式碼。

2. Add PermissionDipspatcher dependencies

開啟build.gradle ,按滑鼠右鍵 -> 選取【Generate】 -> 【Add PermissionDispatcher dependencies】 即自動產生 build.gradle 內第三方類別庫依賴。

Add PermissionDispacher dependencies 尚不適用在 Android Studio 3,倘若在Android Studio 3 使用,請手動加入

    implementation('com.github.hotchemi:permissionsdispatcher:2.4.0') {
        exclude module: "support-v13"
    }
    annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.4.0'

3. Generate Runtime Permissions

開啟MainActivity.java,在空白處按滑鼠右鍵 -> 選取【Generate】 -> 【Generate Runtime Permissions】

選擇 Rebuild將會重新編譯專案,產生必要類別、方法等程式碼。

編譯完成後,自動產生程式碼如下:

@RuntimePermissions
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @NeedsPermission(Manifest.permission.CALL_PHONE)
    void callPhone() {
    }

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

    @OnShowRationale(Manifest.permission.CALL_PHONE)
    void onShowRationale(final PermissionRequest request) {
    }

    @OnPermissionDenied(Manifest.permission.CALL_PHONE)
    void onPermissionDenied() {
    }

    @OnNeverAskAgain(Manifest.permission.CALL_PHONE)
    void onNeverAskAgain() {
    }
}

填入程式碼

  • 按下撥號鍵,在此同樣使用PermissionDispatcher plugin帶來的優勢,自動產生要求授權程式碼。

  • 使用者按下【拒絕】
        @OnPermissionDenied(Manifest.permission.CALL_PHONE)
        void onPermissionDenied() {
            Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show();
        }
  • 第二次(之後)要求授權
    onShowRational目的在提醒使用者,此項授權之必要性,Hank老師給了一個非常貼切的翻譯 — 曉以大義 
        @OnShowRationale(CALL_PHONE)
        void onShowRationale(final PermissionRequest request) {
            new AlertDialog.Builder(MainActivity.this)
                    .setMessage("未允許「" + getString(R.string.app_name) + "」打電話及管理通話權限,將使「" + getString(R.string.app_name) + "」無法正常運作,是否重新設定權限?")
                    .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();
                        }
                    })
                    .create()
                    .show();
        }
  • 使用者勾選【不要再詢問】
        @OnNeverAskAgain(Manifest.permission.CALL_PHONE)
        void onNeverAskAgain() {
            new AlertDialog.Builder(MainActivity.this)
                    .setMessage("");
            Toast.makeText(this, "never ask again", Toast.LENGTH_LONG).show();
        }
  • 撥話
        @NeedsPermission(CALL_PHONE)
        void callPhone() {
            String phoneNum = getPhoneNum();
            if (phoneNum == null) return;
            Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + Uri.encode(phoneNum)));
            startActivity(intent);
        }

     

執行結果 :

我們可以看到,第一次出現要求使用者授權時,對話框上只有【拒絕】和【允許】兩個按鍵,被拒絕後,第二次要求授權,多了【不要再詢問】可供勾選,一旦勾選【不要再詢問】且拒絕授權後,再按撥號鍵,將不再要求授權 (當然,可以提醒使用者到設定畫面重新允許權限等)

各位發現一個困擾了嗎?當使用者勾選不再詢問後,app將不再繼續往下作業,使用者或許忘了曾按下【不要再詢問】及【拒絕】權限,此時會提高app被移除的機率,有沒有其他方式可解呢?有的,下次再和朋友分享其他解法。

最後想再次提醒讀者,工具雖然可加快開發速度,但android 基本運作原理是一切的基礎,任何第三方類別庫均是以此為基礎,請務必熟悉 android 原生 runtime permission 寫法。

版權聲明

本文章版權為郭香宜所有,授權範圍僅限綠豆湯網站使用,除Facebook之類社群等未更改本文章出處之分享行為不在此限,其他個人或公司未經作者同意,不得任意將本文章內容轉載至其他網站,或以任何形式重製,為以免觸犯著作權法,請尊重作者之智慧財產權。

相關文章:

發佈留言

×
×

Cart