Android の Runtime Permission を1行で対処

ここ最近のAndroidアプリを開発している際に、AndroidのRuntime Permissionに悩まされることがよくあります。
そのRuntime Permissionの対応に<font color="#FF0000">1行追加するだけ</font>でRuntime
Permissionに対応できるライブラリを作成しました。
https://github.com/TakuKobayashi/RuntimePermissionChecker
よかったら「スター」や「いいね」をいただいたり、「シェア」して拡散していたっだけたらと思いますm(_ _)m

#導入方法
## ダウンロード

build.gradle(以下の画像参照)
<img src="https://qiita-image-store.s3.amazonaws.com/0/72596/06445332-9566-2b77-f22d-d344d49f4815.png" width="150" height="356">

のdependenciesに以下の内容を追加

```build.gradle
dependencies {
    implementation 'net.taptappun.taku.kobayashi:runtimepermissionchecker:1.1.1'
}
```
これでAndroidのプロジェクトにライブラリが導入されます。

## 実装
ライブラリが導入されたら、自身のActivityに以下のような一例のように追加します。

```MainActivity.java
public class MainActivity extends Activity {
    private static final int REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        RuntimePermissionChecker.requestAllPermissions(this, REQUEST_CODE);
    }
}
```

この

```
RuntimePermissionChecker.requestAllPermissions(Activity activity, int requestCode);
```

を任意の場所に加えることで後は自動的にAndroidのPermissionを確認する処理実行されます。
<font color="#FF0000">※あくまでAndroidのPermissionを確認するダイアログがでるようになるだけなので、以下のようにAndroidManifest.xmlにPermissionの設定の追記を忘れないようにお願いします</font>

```AndroidManifest.xml
<uses-permission android:name="パーミッション名" />
```

### 一括ではなく個別にPermissionを指定して聞きたい
```MainActivity.java
public class MainActivity extends Activity {
    private static final int REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        RuntimePermissionChecker.requestPermission(this, REQUEST_CODE, Manifest.permission.CAMERA);
    }
}
```
この

```
RuntimePermissionChecker.requestPermission(Activity activity, int requestCode, String requestPermission);
```

を任意の場所に加えることで、上記の第3引数(String requestPermission)に個別に聞きたいPermission名を指定することで指定したPermissionを確認する処理実行されます。(上記の場合CameraのPermissionの確認画面が表示されます)

## 補足
### Permissionが全て許可されたときに処理を実行したい
その場合は以下の例のように[onRequestPermissionsResult](https://developer.android.com/reference/android/app/Activity.html#onRequestPermissionsResult(int, java.lang.String[], int[]))のcallbackが呼ばれたときに処理を実行するようにします。

```MainActivity.java
public class MainActivity extends Activity {
    private static final int REQUEST_CODE = 1;

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        if (requestCode != REQUEST_CODE)
            return;
        if(!RuntimePermissionChecker.existConfirmPermissions(this)){
            // write features you want to execute.
        }
    }
}
```

この

```
RuntimePermissionChecker.existConfirmPermissions(Activity activity);
```
はまだ聞くべきpermissionがある場合、<font color="#0000FF">ture</font>になります。

### 個別のPermissionが許可されたかどうか確認したい
上記、全てのPermissionが許可された時ではなく、個別のPermissionが許可されたかを確認したい場合は

```
RuntimePermissionChecker.hasSelfPermission(Activity activity, String requestPermission);
```

このメソッドを使って確認することができます。このメソッドの第2引数に個別に確認したいPermission名
を指定し、すでに許可された場合、<font color="#0000FF">ture</font>になります。

### Android 6.0 Marshmallow(API Level 23)未満の場合は?
上記の処理にこの場合の対応も入っています。

### すでにユーザーがpermissionを許可した後の場合は?
上記の処理にこの場合の対応も入っています。

# そもそもRuntime Permissionって何?
Android 6.0 Marshmallow(API Level 23)以降では、アプリの実行時に特定の機能を使うときはユーザーの許可(パーミッション)を求める必要があり、そのユーザーの許可なしには機能が使えないようになりました。(カメラとかマイクとかSDカードに情報を保存したりだとか...)
要するにこんな感じのダイアログです。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f33343438382f32303466316232632d623732362d363466612d346235662d3639343333386565613136372e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/72596/78b5dfc4-bce1-be24-aeb3-25dbfa947b58.png)
もちろん、このダイアログを出すためにはアプリ側で処理を書く必要があります。
より詳しくはこちらを参考

 * [実行時のパーミッション リクエスト | Android Developers](https://developer.android.com/training/permissions/requesting.html)

Androidのアプリの開発を多く行い、Android 2系の頃からAndroidアプリの開発をしている身としてはこのRuntime Permissionの実装など考えたくもないので、最大限の譲歩として、なんとか1行追加だけですましたかったです。
そのため、どんなアプリを作る場合においても

 * とりあえずこのライブラリをいれておく
 * とりあえずこのメソッドをよぶ

ということで全て解決してくれるようなものにしてみました。
※なお今回が初めてのAndroidライブラリの公開につき、以下様々な記事を参考いたしました

# 参考
 * [実行時のパーミッション リクエスト | Android Developers](https://developer.android.com/training/permissions/requesting.html)
 * [Android のライブラリの作りかたと Bintray にアップロードするまでの手順 | rakuishi.com](https://rakuishi.com/archives/release-android-library-to-bintray/)
 * [作ったAndroidライブラリを公開する方法](https://qiita.com/gupuru/items/aa81f007d306fc6c4a2c)
 * [【Android】Libraryを作ってprivateなgithubリポジトリにpushして、チームのみんなでgradleに書くだけで使えるようにするまで](https://qiita.com/kgmyshin/items/87f560172c31c2fbd899)
 * [JitPack.io を使えば簡単に自作 Android ライブラリを配布できてとても便利だった](https://qiita.com/sho5nn/items/3c0210409541263f3618)

---
追記
2017/12/13(水) Bintrayに登録できました。またjcenterにも登録できましたので、ライブラリのインストール方法を更新しました