見出し画像

Androidアプリ開発入門 (1) - PermissionsDispatcher

「PermissionsDispatcher」の使い方をまとめました。

・API 29: Android 10 (Q)
・PermissionsDispatcher 4.8.0

1. PermissionsDispatcher

PermissionsDispatcher」は、複雑になりがちな、ユーザーからのアプリ権限の許可を得る処理を、アノテーションでシンプルに記述することができるライブラリです。

2. Androidのパーミッション

Androidのパーミッションには、「Normalパーミッション」と「Dangerousパーミッション」があります。

・Normalパーミッション : ユーザーがアプリをインストールするだけでアプリ権限が得られる。
・Dangerousパーミッション : ユーザーからアプリ権限の許可を得る必要がある。

主な「Dangerousパーミッション」は、次のとおりです。

・カレンダー
 ・android.permission.READ_CALENDAR
 ・android.permission.WRITE_CALENDAR
・カメラ
 ・android.permission.CAMERA
・アドレス帳
 ・android.permission.READ_CONTACTS
 ・android.permission.WRITE_CONTACTS
 ・android.permission.GET_ACCOUNTS
・位置情報
 ・android.permission.ACCESS_FINE_LOCATION
 ・android.permission.ACCESS_COARSE_LOCATION
・マイク
 ・android.permission.RECORD_AUDIO
・通話
 ・android.permission.READ_PHONE_STATE
 ・android.permission.CALL_PHONE
 ・android.permission.READ_CALL_LOG
 ・android.permission.WRITE_CALL_LOG
 ・android.permission.ADD_VOICEMAIL
 ・android.permission.USE_SIP
 ・android.permission.PROCESS_OUTGOING_CALLS
・センサー
 ・android.permission.BODY_SENSORS
・SMS
 ・android.permission.SEND_SMS
 ・android.permission.RECEIVE_SMS
 ・android.permission.READ_SMS
 ・android.permission.RECEIVE_WAP_PUSH
 ・android.permission.RECEIVE_MMS
・ストレージ
 ・android.permission.READ_EXTERNAL_STORAGE
 ・android.permission.WRITE_EXTERNAL_STORAGE

3. PermissionsDispatcherのインストール

 「build.gradle (Module: XXXX.app)」に以下を追加し、「Sync Now」で同期します。

apply plugin: 'kotlin-kapt'

dependencies {
       :

   implementation "com.github.permissions-dispatcher:permissionsdispatcher:4.8.0"
   kapt "com.github.permissions-dispatcher:permissionsdispatcher-processor:4.8.0"
}

4. PermissionsDispatcherの使い方

「PermissionsDispatcher」を使ってカメラのアプリ権限の許可を得るコードを実装してみます。

(1) AndroidManifest.xmlにパーミッションを追加。
今回は、カメラのパーミッションを追加します。

<uses-permission android:name="android.permission.CAMERA"/>

(2) MainActivityを以下のようにコードを記述。

package net.npaka.helloworld

import android.Manifest
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import permissions.dispatcher.*

@RuntimePermissions
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        this.supportActionBar?.hide()

        // showCamera()をパーミッションチェック付きで呼ぶ
        showCameraWithPermissionCheck()
    }

    // 許可された時に呼ばれる
    @NeedsPermission(Manifest.permission.CAMERA)
    fun showCamera() {
        Toast.makeText(this, "許可された", Toast.LENGTH_SHORT).show()

        // カメラ処理をここに記述
    }

    // 説明が必要な時に呼ばれる
    @OnShowRationale(Manifest.permission.CAMERA)
    fun onCameraShowRationale(request: PermissionRequest) {
        AlertDialog.Builder(this)
            .setPositiveButton("許可") { _, _ -> request.proceed() }
            .setNegativeButton("許可しない") { _, _ -> request.cancel() }
            .setCancelable(false)
            .setMessage("カメラを利用します")
            .show()
    }

    // 拒否された時に呼ばれる
    @OnPermissionDenied(Manifest.permission.CAMERA)
    fun onCameraPermissionDenied() {
        Toast.makeText(this, "拒否された", Toast.LENGTH_SHORT).show()
    }

    // 「今後表示しない」が選択された時に呼ばれる
    @OnNeverAskAgain(Manifest.permission.CAMERA)
    fun onCameraNeverAskAgain() {
        Toast.makeText(this, "「今後表示しない」が選択された", Toast.LENGTH_SHORT).show()
    }
}

処理の流れは、次のとおりです。

・showCameraWithPermissionCheck() : showCamera()をパーミッションチェック付きで呼ぶ
    ↓
 パーミッションダイアログ
    ↓
・showCamera() : 許可された時に呼ばれる
・onCameraShowRationale() : 説明が必要な時に呼ばれる
・onCameraPermissionDenied() : 拒否された時に呼ばれる
・onCameraNeverAskAgain() : 「今後表示しない」が選択された時に呼ばれる

以下のアノテーションを付加することで、各メソッドに役割を割り当てています。

@RuntimePermissions (必須) : 権限を処理するActivityまたはFragmentに付加
@NeedsPermission (必須) : 権限が必要な処理を行うメソッドに付加。パーミッションチェック付きで呼ぶ場合は、このメソッドの名前にWithPermissionCheck()を付加したものを呼ぶ
@OnShowRationale : 説明が必要な時の処理を行うメソッドに付加
@OnPermissionDenied : 拒否された時の処理を行うメソッドに付加
@OnNeverAskAgain : 「今後表示しない」が選択された時の処理を行うメソッドに付加

(3) ビルド。
パーミッションチェックのメソッド(showCameraWithPermissionCheck())は「PermissionsDispatcher」で生成されるメソッドです。メソッド不明エラーで、ビルドできない場合は、「Build -> Rebuild Project」でリビルドします。

(4) 実行。
パーミッションダイアログが表示されることを確認します。

画像1

次回



この記事が気に入ったらサポートをしてみませんか?