もんりぃ is undefined.

育児ネタとか、技術ネタとか。

Unity で Android 6.0 の Runtime Permission に対応してみて得られた知見

はじめに

現在、「端末のマイクで声を録音する」という要件を含んだパビリオンを開発しています。 んで、対応するためには Runtime Permission へのサポートを行う必要があるわけです。 その辺対応している時に色々調べたので、その知見を雑に纏めます。

ハマりポイント

  • iOS と足並みを揃える
  • Unity のお節介
  • AndroidManifest.xml マージ

iOS と足並みを揃える

iOSAndroid とで Runtime Permission の実装方法は異なります。*1 大きな違いとして Android では Application.RequestUserAuthorization が使えない(っぽい) という点が挙げられます。 このため、Android 用に専用処理を書いてあげる必要があります。

細かい説明は他のブログ記事に譲りますが、 UnityEngine.AndroidJavaClass とかを使って android.support.v4.content.ContextCompat.checkSelfPermission() とか android.support.v4.app.ActivityCompat.requestPermissions とかを呼んであげる感じですね。 詳細なコードは、以下のリポジトリが参考になるんじゃないですかね?(宣伝)

Android での Runtime Permission

github.com

Unity のお節介

最新の Unity *2 は、プロジェクト内で UnityEngine.Microphone クラスを使用しており、かつ Target SDK Version が API Level 23 (Android 6.0 / Marshmallow) 以上の場合に、「起動時に Runtime Permission ダイアログを出す」という心折親切設計になっております。 このため、「いや、ちゃうねん。自分で制御するから、そういうのええねん!」という人にとっては、問題になります。 で、これを回避するための手段もちゃんと用意されています。

ザックリ要約すれば「<meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />AndroidManifest.xml に追記」すれば OK です。簡単ですね!

AndroidManifest.xml のマージ

で、じゃあ AndroidManifest.xml に書こうかな、と思った時に、ぶつかるのが「 AndroidManifest.xml のマージ」に関する問題です。 言い換えると、Unity で Android 向けに APK をビルドすると、ヨシナに AndroidManifest.xml のマージ処理を走らせてくれるのですが、この辺のマージルールについてしっかり理解して上記の unityplayer.SkipPermissionsDialog を追記してあげないといけない、ってコトですね。 Android Developer のドキュメント にしっかり纏められているので、詳細はこちらを参照してください。

やり方としては、「小さい Library Project として AndroidManifest.xml マージ用の設定を配置する」と楽なんじゃないかと。 詳細な設定としては、以下のリポジトリが参考になるんじゃないですかね?(宣伝)(しつこい)

AndroidManifest.xml

github.com

project.properties

github.com

まとめ

実機のアレコレは、色々とハマリどころが多いので大変ですね。

*1:そもそも iOS では Runtime Permission って呼ばないけど。

*2:いつから対応されたのかは調べてない。