4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PermissionsDispatcherを使ったMパーミッション

Last updated at Posted at 2017-12-01

こちらの記事を参考にしました。
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);
    }

}

動きは以下の通り。

許可した場合

  1. PermissionsDispatcher.grantPermissionCheck()メソッドで現在の権限の有無を確認する
  2. grant()メソッドを呼び出す

許可しない場合

  1. PermissionsDispatcher.grantPermissionCheck()メソッドで現在の権限の有無を確認する
  2. onRequestPermissionsResult()メソッドでリクエスト結果を受け取る

許可しない場合(OnShowRationaleを実装した場合)

  1. PermissionsDispatcher.grantPermissionCheck()メソッドで現在の権限の有無を確認する
  2. onShowRationale()メソッドを呼出す

絶対に許可しない場合

  1. PermissionsDispatcher.grantPermissionCheck()メソッドで現在の権限の有無を確認する
  2. onNeverAskAgain()メソッドを呼出す
  3. onRequestPermissionsResult()メソッドでリクエスト結果を受け取る

ご指摘あればコメント下さい。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?