[Xamarin] Android intent.ResolveActivity が null になる
ResolveActivity の必要性について
Android の開発において、アプリで処理できないインテントを使用して StartActivityForResult を呼び出すとクラッシュするので、ResolveActivity で呼び出しを保護することが求められています。
ResolveActivity をしないで try ~ catch するという方法もありますが、推奨はされません。
Xamarin.Android で他のカメラアプリを起動して撮影して戻してもらう場合は intent に MediaStore.ActionImageCapture を指定して起動します。
1 2 3 4 5 6 7 8 9 |
var intent = new Intent(MediaStore.ActionImageCapture); if (intent.ResolveActivity(PackageManager) != null) { intent.PutExtra(MediaStore.ExtraOutput, photo_uri); StartActivityForResult(intent, RESULT_PHOTO_CAPTURE); } |
ResolveActivity を入れると上記のようなコードになりますが、 ResolveActivity()
の戻り値が常に null になってしまっていました。何が足りないのでしょうか。
解決策
AndroidManifest.xml に以下のコードを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 |
<queries> <!-- Camera --> <intent> <action android:name="android.media.action.IMAGE_CAPTURE" /> </intent> <!-- Gallery --> <intent> <action android:name="android.intent.action.GET_CONTENT" /> </intent> </queries> |
これは applications タグの外側に記載する必要があります。
これを記載することで ResolveActivity の戻り値が常に null になることはなくなります。