Android6からの面倒くさい権限をサクッと解決する

#permissionsdispatcher

スッキリ書ける。
https://github.com/hotchemi/PermissionsDispatcher


電話のデモで試してみた。

##build.gradle(Module:app)


permissionsdispatcherをインストール

```py

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "24.0.0"
    defaultConfig {
        applicationId "jp.co.test.permissionsdispatcherdemo"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.1'
    testCompile 'junit:junit:4.12'

   // 追加
    compile 'com.github.hotchemi:permissionsdispatcher:2.3.0'
    annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.3.0'

}

```

## AndroidManifest.xml

電話の権限を追加

```xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.co.test.permissionsdispatcherdemo">

    <!-- 追加 -->
    <uses-permission android:name="android.permission.CALL_PHONE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

```

```java:MainActivity.java

import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.OnNeverAskAgain;
import permissions.dispatcher.OnPermissionDenied;
import permissions.dispatcher.OnShowRationale;
import permissions.dispatcher.PermissionRequest;
import permissions.dispatcher.RuntimePermissions;

@RuntimePermissions
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MainActivityPermissionsDispatcher.電話するWithCheck(MainActivity.this);
    }

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

    @SuppressWarnings("unused")
    @NeedsPermission(Manifest.permission.CALL_PHONE)
    public void 電話する() {
        Intent intent = new Intent(
                Intent.ACTION_CALL,
                Uri.parse("tel:0123456789"));
        startActivity(intent);
    }

    //許可しないが選択された
    @OnPermissionDenied(Manifest.permission.CALL_PHONE)
    void 許可しないが選択された() {
        Toast.makeText(this, "許可しないが選択されました。次回から「今後表示しない」にチェックを入れるることで、" +
                "表示されません。", Toast.LENGTH_SHORT).show();
    }

    // 絶対に表示しない状態
    @OnNeverAskAgain(Manifest.permission.CALL_PHONE)
    void 絶対に表示しないを選択している() {
        Toast.makeText(this, "権限が拒否されたので一部の機能が使えません。", Toast.LENGTH_SHORT).show();
    }

    @SuppressWarnings("unused")
    @OnShowRationale(Manifest.permission.CALL_PHONE)
    void 権限の説明ダイアログを表示(final PermissionRequest request) {
        new AlertDialog.Builder(this)
                .setTitle("警告")
                .setMessage("電話の権限を許可しないと電話することが出来ません。アプリを使いたい場合は許可して下さい。")
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // パーミッション許可ダイアログ
                        request.proceed();
                    }
                })
                .setNegativeButton("Cancel", null)
                .show();

    }
}

```