【Unity】Android アプリでパーミッション(権限)要求をする 
2019/01/14 Mon [edit]
もしかしたら Unity2018.3.x のバグかも知れないが、Android ビルドした際に、パーミッション(権限)要求が自動で出なくなったので、「一部機能が使えない」等のトラブルが結構出てるのではないかと、改めて記事を書いてみた。

公式のデベロッパーサイトにも掲載されているが、Android 8.0 ではパーミッション付与の仕様(どちらかというとガイドライン)も変更されたようで、今まではアプリ起動時に権限要求が自動で全て表示されてたけど、Android 8.0 以降では、その機能を利用するときに権限を要求しましょうということになっている(不要な権限やセキュリティに関わる権限をなるべく減らし、ユーザーにとって許可する内容をわかりやすくするため)。
・Android 8.0 での動作変更点>パーミッション
・実行時のパーミッション リクエスト
冒頭に書いた「バグかも知れない」というのは、Unity でアプリビルドした際には自動で起動時に権限要求が表示されていたからだ。Android 開発では Android 6.0 以降、その機能は実装されているが、Unity のみ開発している人にとっては、割と敷居の高い設定項目となる(公式にも「上級レベルの Android 開発者にのみ推奨」とある)。そのうち、Android ビルドで権限要求の選択ができるようになるかも知れないが(例えば PlayerSettings>Other Settings>Configuration>Write Permission を「External (SD Card)」にすると、書き込み権限が自動的に要求される)、とりあえず現在の状態ではそういう機能はないので、プラグインを使って権限要求する方法を書いておこう。
なお、今回の記事はプラグインのデモも兼ねている。サンプルシーンを使えば1から構築する必要はないので、すぐに試してみたい人はプラグインをダウンロードして欲しい。AssetStore版[無料]とGoogleDrive版の2つがあるが、基本的にはどちらも同じものだ。好きな方で構わない。
プラグインデモをダウンロード


Android 4.2以上
※「提供元不明アプリのインストール」許可が必要です。
プラグイン自体のセットアップは以前の記事を参照して欲しい(>>GoogleDrive版 | >>AssetStore版)。デモが入っているパスは GoogleDrive 版では「Assets/_Test/」に、AssetStore版は「Assets/FantomPlugin/Demo/」となっているので適宜置き換えて欲しい。ファイル名は基本的に同じだ。
■プラグインのセットアップ(AssetStore 版) [※別ページ]
■PermissionCheckController を配置と使い方
■AndroidManifest.xml を設定する
(※) Unity 2018.3.1f1 / Windows10(x64) で確認
■PermissionCheckController を配置と使い方
実際、以前の記事にも書いたのだが、パーミッション要求というのは通常ネイティブで書くしかないので、Unity で利用するには非常に困難である。なので、誰でも手軽に使えるようにプラグインとして導入しておいた(プラグインの中身も以前の記事とほぼ同じ)。その使い方を簡単に説明しておこう。
「PermissionCheckController」はプレファブとスクリプトで提供している(FantomLib/Prefabs/System/ 以下 ※検索で探すと楽)。これをシーンにドラッグ&ドロップで配置しよう。配置したら、以下の項目を設定すれば完了だ。


※ここではデモシーン「ExternalStorageTest」の「AndroidFunctions」に入っているプレファブを使っているが、
基本的に同じものである(説明ダイアログ付きのデモとなっている)。
Permission | 要求する権限の文字列定数。この文字列定数は公式のデベロッパーサイトに掲載されている「Constant Value」の値を指定する。例えばカメラの権限なら「android.permission.CAMERA」を入れる。基本的に "android.permission.~" で始まる文字列となる。 |
---|---|
Check On Start | Unity のライフサイクル Start() で自動的にパーミッションのチェックが実行される。シーンごとに配置している場合は、プレファブがアクティブなら、シーン開始時にチェックされるようになる。 |
Request When Not Granted | パーミッションをチェックした際、許可されてないときのみ、要求ダイアログを出す(ユーザー設定により、出ないこともある)。オフのときは、要求ダイアログは出さず、結果のみコールバックへ返す。 |
Title, Message, Style, Localize | 権限要求の説明ダイアログのタイトル, メッセージ, スタイル, ローカライズの設定(多言語対応)。 Localize>Localize Resource が設定されてないときは、Title, Message で設定されている文字列のみが使われる(単一言語)。 |
On Result | パーミッションチェックの結果を Permission の文字列と真偽値(true = 許可 / false = 拒否)でコールバックする。複数同時に要求しているとき判別するのに使う。 |
On Granted | パーミッションチェックの結果が「許可(Granted)」のときのみコールバックする。 |
On Denied | パーミッションチェックの結果が「拒否(Denied)」のときのみコールバックする。 |
On Allowed | パーミッションチェックの結果が「許可(Granted)」に変更されたときのみコールバックする(元から許可されてる、または拒否のときは何もしない)。 |
・Manifest.permission(パーミッションの文字列定数)
・テーマ(スタイル)
・【Android】【Java】パーミッションの付与(許可)のチェックと要求をする
■AndroidManifest.xml を設定する
意外と重要なのは、このマニフェストファイルの設定である。少なくとも以前はこの辺りを Unity が自動でやっていてくれたのだが、Unity2017 での Gradle ビルド導入以降、ある程度は自分で書いた方が良いこともある。例えばビルドエラー(or コンフリクト)が出たときなども、手動で直せることもある。
最終的にマニフェストファイルは「Assets/Plugins/Android/AndroidManifest.xml」を中心に統合されたファイルとなる。そして、その設定に従ってアプリが起動する(なのでアプリが起動できないときは、このファイルを疑うのも良い)。
ちなみにデフォルトのマニフェストテンプレートは Unity をインストールしたフォルダ以下の「Editor/Data/PlaybackEngines/AndroidPlayer/Apk/AndroidManifest.xml」にあり、
現在の出力されているマニフェストを見たいなら、ビルドした直後に、プロジェクト内の
「Temp/StagingArea/AndroidManifest.xml」を開けば見ることができる。
・Android マニフェスト
・アプリ マニフェスト
・UnityPlayerActivity Java コードの拡張
ただ、資料を見ると結構難しく感じるので、ここではプラグインに付属している「AndroidManifest_test.xml」(AssetStore版は「_demo.xml」)を複製して「AndroidManifest.xml」にリネームし、これに少し手を加える形で使ってみよう。内容がわかるようになったら、自由に設定すれば良いのである。以前の記事にも書いたが、要点だけを抜き出すと「<manifest>~</manifest>」タグの間に「<uses-permission ~」で要求したい権限を書いておくことが必要となる。

例えば、カメラやマイクの権限を要求したいなら、以下のように書いておく(マニフェストに書いてない権限は要求できない)。
<manifest>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
・・・(略)・・・
</manifest>
・パーミッションの設定
・Manifest.permission(パーミッションの文字列定数)
また、手動で要求する場合、「<application>~</application>」または「<activity>~</activity>」タグの間に、以下を入れて「自動で要求するのをスキップさせる」と良いとも公式に書いてある。
<meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
・Android マニフェスト
まぁ、この辺りは定形処理なので、そのうちまた自動化されそうだが(もしかしたら、この自動化あたりがバグっている?[Unity2018.3.1f1 時点])、最近は色々なプラグインを導入する機会も増えてきたので、覚えておくとイザというとき役に立つだろう。
(関連記事)
【Android】【Java】パーミッションの付与(許可)のチェックと要求をする
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】AssetStore版 FantomPlugin のセットアップ
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る
【Unity】【C#】モバイルビルド中の警告:Game scripts or other custom code contains OnMouse_ event handlers.~ を消す
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/317-a3b62931
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |