［Android］全てのパーミッションが許可されるまで起動しないようにする 

# はじめに

Dangerous パーミッションを全て許可されるまで、
アプリを起動しないようにしたい場合があったので、
そうしたい場合にどう実装すればよいか調べたのでまとめます。

# 1. easypermission を使えるようにする

次に内容を build.gradle(app) に記載して easypermission を使えるようにします。
ちなみに easypermission は Android 6.0 以上から必要となる 
Dangerous パーミッションの認証処理を簡単に実装するためのラッパーライブラリです。

```xml:build.gradle(app)
dependencies {
    implementation 'pub.devrel:easypermissions:3.0.0'
}
```

# 2. 利用するパーミッションを AndroidManifest に定義する

次の内容を build.gradel(app) に記載し利用するパーミッションを定義します。
今回は 外部ストレージ・位置情報・カメラ を利用するためのパーミッションを定義します。

```xml:AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" package="kaleidot725.exifreader">
 　　　　︙
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.CAMERA"/>
       ︙
</manifest>
```

# 3. 利用するパーミッションが許可されているか確認する

EasyPermissions.hasPermissions() で利用するパーミッションが許可されているか判定できます。
次のように記載し 外部ストレージ・位置情報・カメラ へのパーミッションが許可されているか確認します。

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks{
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val permissions = arrayOf(
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.CAMERA
        )

        if (!EasyPermissions.hasPermissions(this, *permissions)) {
            // パーミッションが許可されていない時の処理
        }
    }
}
```

# 4. 利用するパーミッションの許可をユーザーにリクエストする

EasyPermissions.requestPermissions() で利用するパーミッションの許可をユーザーにリクエストできます。
次のように許可されていなければ、パーミッションの許可をユーザーにリクエストします。
全てのパーミッションが許可される前にアプリケーションの初期化が開始されるとまずいのでリターンしておきます。

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks{
    companion object {
        private val REQUEST_CODE = 0
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val permissions = arrayOf(
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.CAMERA
        )

        if (!EasyPermissions.hasPermissions(this, *permissions)) {
            EasyPermissions.requestPermissions(this, "パーミッションに関する説明", REQUEST_CODE, *permissions)
            return
        }
        // 許可されていれば、アプリケーションの初期化を開始する。
    }     
}  
```

# 5. ユーザーがパーミッションを許可したか確認する

EasyPermissions.PermissionCallbacks を MainActivcity に実装すると
EasyPermissions.requestPermissions でユーザーの許可が得られたか確認できます。

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks{
    override fun onPermissionsGranted(requestCode: Int, list: List<String>) {
        // ユーザーの許可が得られたときに呼び出される
    }

    override fun onPermissionsDenied(requestCode: Int, list: List<String>) {
        // ユーザーの許可が得られなかったときに呼び出される。
    }
}
```

今回は全てのパーミッションが許可されるまでアプリを起動しないようにしたいので、
許可が得られない場合は finish を呼び出し Activity を終了するようにします。

このままだと許可が得られた場合にはアプリケーションが初期化されないままになってしまうので、
許可が得られた場合には recreate で Activity を再生成し アプリケーションが初期化するようにします。

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks{
    override fun onPermissionsGranted(requestCode: Int, list: List<String>) {
        recreate()
    }

    override fun onPermissionsDenied(requestCode: Int, list: List<String>) {
        finish()
    }
}
```

# おわりに

次のような感じで全てのパーミッションが許可されるまで起動できないようにできます。
![ezgif.com-resize.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/127b16aa-62cb-ed60-76b4-5af7e69833f6.gif)


# 参考文献
- [Permissions overview | Android Developers](https://developer.android.com/guide/topics/permissions/overview)
- [easypermissions](https://github.com/googlesamples/easypermissions)