こちらの記事を参考にしました。
https://qiita.com/kazy/items/0ded30d80cef9df54c98
PermissionsDispatcherを使ったMパーミッション対応のスニペットです。
PermissionsDispatcherを使うための準備は省略しているので事前準備は各自行ってください。
import android.Manifest;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.OnNeverAskAgain;
import permissions.dispatcher.OnShowRationale;
import permissions.dispatcher.PermissionRequest;
import permissions.dispatcher.RuntimePermissions;
/*
* 例として READ_EXTERNAL_STORAGE のMパーミッション対応を行います。
* Mパーミッション実装のためにPermissonDispatcherを利用しています。
*/
@RuntimePermissions
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MainActivityPermissionsDispatcher.grantedWithPermissionCheck(this);
}
// 許可した場合
@NeedsPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
void granted() {
Log.d(TAG, "onRequestPermissionsResult:GRANTED");
// TODO 許可されたのでストレージにアクセスする
}
// 絶対に許可しない状態
@OnNeverAskAgain(Manifest.permission.READ_EXTERNAL_STORAGE)
void onNeverAskAgain() {
Log.d(TAG, "onRequestPermissionsResult:DENYED");
}
// 許可しない状態中にパーミッションチェックを行うと呼ばれる
@OnShowRationale(Manifest.permission.READ_EXTERNAL_STORAGE)
void onShowRationale(final PermissionRequest request) {
Log.d(TAG, "shouldShowRequestPermissionRationale:追加説明");
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();
}
// リクエストを受け取る
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
Log.d(TAG, "onRequestPermissionsResult:結果を受け取る");
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
}
動きは以下の通り。
許可した場合
- PermissionsDispatcher.grantPermissionCheck()メソッドで現在の権限の有無を確認する
- grant()メソッドを呼び出す
許可しない場合
- PermissionsDispatcher.grantPermissionCheck()メソッドで現在の権限の有無を確認する
- onRequestPermissionsResult()メソッドでリクエスト結果を受け取る
許可しない場合(OnShowRationaleを実装した場合)
- PermissionsDispatcher.grantPermissionCheck()メソッドで現在の権限の有無を確認する
- onShowRationale()メソッドを呼出す
絶対に許可しない場合
- PermissionsDispatcher.grantPermissionCheck()メソッドで現在の権限の有無を確認する
- onNeverAskAgain()メソッドを呼出す
- onRequestPermissionsResult()メソッドでリクエスト結果を受け取る
ご指摘あればコメント下さい。