android6系からは、アプリのインストール者が自らアプリに必要な権限の有効・無効を設定することができるようになりました。

権限が無効なまま権限が必要な操作をされてしまうと、アプリが落ちてしまうなどしてしまうので、
必要な権限をonにすることをアプリ側で知らせないといけなくなりました。

これらを実装するときに、その場で必要なものだけをinputして組んでいたので、
よくまとまっていたgoogleのandroid-Cemera2Videoを例に一度まとめていみたいと思います。

必要な権限を知らせるタイミング

sampleでは、cameraを開くタイミングでカメラを使用するのに必要な
権限チェックをしています。

まずは、必要な権限がonになっているかをチェックします。

必要な権限のチェックは、ActivityCompat.checkSelfPermission関数で判定します。
Fragmentの場合もFragmentCompat.checkSelfPermission関数が定義されています。
また、supportLibraryのクラスとして、PermissionChecker classも使用することができます。

権限が有効でない場合、権限を有効にするようユーザに要求します。

ここで、以前ユーザに権限チェックを要求したときに、拒否された場合はtrueを返す
shoulShowRequestPermissionRationaleを呼んでいます。

trueの場合は権限確認ダイアログを出します。

権限有効化okの場合権限を有効にするかを設定できるダイアログを出現させる
requestPermissions関数を呼び出します

第2引数に必要なpermissionの文字列を第3引数にcallback関数として呼ばれる
onRequestPermissionResult関数のrequestCodeにあたる数値をいれます。

では、onRequestPermissionResult関数の中身です。

permissionを要求した結果がint[] grantResults内に返却されます。
sampleでは、権限要求に応じなかった場合はErrorDialogを出しています。

sampleでは、こんな感じで実装されていました。
android developerページでもtutotiralが日本語で上がっています。

いざ既存のアプリで対応する場合処理ごとにまとまっていれば、対応するものそう大変そうではないですが、
そうじゃないと大変そうですね。