今回はAndroidエンジニアにとって、面倒なRuntime Permissionについてです。
ユーザがVR実行中でも、アプリは必要に応じてユーザに許可を得る必要があります。
ただ、残念なことに一旦ヘッドセットを外す必要があります(なんでコントローラから確認を行えるようにしなかったのかは不明)。
画面遷移としては以下のようになります。
画面番号 ヘッドセット装着状態画面備考
装着中
-
装着→外した状態
スマートフォンをViewerから外して、画面方向を横→縦に変更すると次のPermission確認画面に遷移
com.google.vr.vrcoreプロセス上にて表示
外した状態
com.google.android.packageinstallerプロセス上にて表示
外した状態→装着中
「RETURN TO VR」ボタンをタッチすると、VRに戻る
自アプリプロセスにて表示

Google VR SDK for Unityとしても、Runtime Permissionに対するAPIが提供されています。

GvrPermissionsRequester

こちらの「GvrPermissionsRequester」がRuntime Permissionをユーザに確認するためのクラスとなります。
本クラスのインスタンスはInstanceプロパティで取得しますが、インスタンスが設定されていないケースが存在します。
インスタンスが設定されていないケースとしては、以下のケースがあります。
  • Unityのエミュレータ(Unity Editor)上でアクセスした場合
  • Unityのエミュレータでは、Android自体のシステムが動作しないので、こちらは使用できません。
  • FragmentがActivityにアタッチする前、もしくはデタッチした後
  • Androidの実機でも、こちらのインスタンスは別途Fragmentを生成しているので、FragmentがActivityにアタッチする前、もしくはデタッチした後は使用できないものとなります。

HasPermissionsGranted, IsPermissionGranted

確認したいPermissionが得られているか否かを確認するためのメソッドが2種類用意されています。
やっていることは一緒で、メソッドにて一括でPermission確認を実施しているか否かの違いしかないです。
メソッド名称概要備考
HasPermissionsGranted指定された複数のPermissionをユーザに一気に確認Activity.checkSelfPermissionをそれぞれのPermission毎にコールしている
IsPermissionGranted指定されたPermissionをユーザに確認Activity.checkSelfPermissionをコールしている

ShouldShowRational

[2017.10.2訂正(S)]指定されたPermissionに対して、ユーザに確認を行うためのUI(ダイアログ)を表示する必要があるか否かをOSに確認するためのメソッドになります。
これで確認を行わずに、RequestPermissionsを実行すると、上記の画面遷移③のユーザ確認が行われずに、そのまま画面遷移④が発生する動作になります。
そのため、ヘッドセットの着脱をした意味がなくなるので、このメソッドで実際にユーザ確認が必要か確認した方がよいでしょう。
指定されたPermissionが何のために必要なのかを示すUIを表示すべきか否かの判定が行われます。
例えば、撮影した写真の位置情報をタグ付けしたい場合に、ユーザが位置情報の取得が写真撮影と関連していることを知らない場合に意図が不明になります。
そのような場合に別途説明するUIが必要と考えられています。そのUIを表示すべきか否かを判断するAPIとなります。 [2017.10.2訂正(E)]
本メソッドは内部でActivity.shouldShowRequestPermissionRationaleをコールしているだけなので、使い方はActivity.shouldShowRequestPermissionRationaleと一緒になります。

RequestPermissions

このメソッドを実行するとユーザに対してPermissionの確認が発生します(画面遷移②が表示されます)。
この先はSDK内部で処理が行われ、メソッドコール時に指定したコールバックに結果が返ってくるようなメソッドになっていますが、こちらで確認した限り、ほとんどコールされませんでした。

画面遷移②の段階で、自アプリはcom.google.vr.vrcoreアプリの裏に隠れるため、自アプリがOSによる再起動の対象になり、一旦プロセスが終了されます。その後、画面遷移④で自アプリが再起動されて、「RETURN TO VR」ボタンの表示までは意図した動作に見えるのですが、それを押下したタイミングでログに「PermissionsFragment: Permission callback object is null!」が出力されています。
これはcom.google.gvr.permissionsupport.PermissionsFragment(以下、Google VR SDK for Unity v1.70.0にて確認)の以下のメソッドで出力されているものになります。
    public static void setPermissionResult(boolean allGranted) {
        if(permissionsCallback != null) {
            permissionsCallback.onRequestPermissionResult(allGranted);
        } else {
            Log.w("PermissionsFragment", "Permission callback object is null!");
        }

    }
staticフィールドの"permissionsCallback"がnullの場合に出力されるようになっていますが、こちらはプロセスが再起動されてしまったことにより初期化されてしまっているためにコールバックができない状態になっています。

上記の点から、Permission確認をPermissionが必要なモジュールにアクセスする直前に実施すると、アプリの再起動が発生することによりユーザ操作の手戻りが多くなるので起動直後に確認した方が良さそうです。

コメントの投稿