James
October 15th, 2020
開発者がアプリ体験に統合できるいくつかの興味深いアップデートが導入された Android 11。 新機能に加えて、Android 11 にアップグレードして再ターゲットする際に、開発者がアプリケーションに統合する必要がある、プライバシーに関する強化事項もいくつかあります。 それらの強化点の 1 つは、ユーザーのデバイス上にインストールされたアプリケーションとパッケージを照会する機能を変更するパッケージの可視性の導入です。
ブラウザを開くかメールを送信したい場合、アプリケーションはIntent
を介してデバイス上の別のアプリケーションを起動して対話する必要があります。 StartActivity
を呼び出す前に、QueryIntentActivities
または ResolveActivity
を実行して、要求を処理できるアプリケーションがあることを確認するのがベスト プラクティスです。 Xamarin.Essentials を使用している場合、ブラウザ (外部)、電子メール、および SMS ではライブラリがすべてのロジックを自動的に処理するため、これらの API を見たことがないかもしれません。
以前の Android 11 では、すべてのアプリはインストールされているすべてのアプリケーションに簡単に照会でき、StartActivity
が呼ばれると特定の Intent
が開かれるかどうか確認することができました。 しかし、Android 11 では、パッケージの可視性が導入されたため、すべてが変わりました。 5489>
一度 Android 11 にターゲット変更し、Android 11 を実行しているデバイスでアプリケーションを実行すると、QueryIntentActivities
を使用した場合は結果がゼロになります。 Xamarin.Essentials を使用している場合、アクティビティを照会する必要がある API のいずれかを呼び出そうとすると、FeatureNotSupportedException
が表示されます。 Xamarin.EssentialsのEmail機能を使っているとします。 あなたのコードは次のようになります:
public async Task SendEmail(string subject, string body, List<string> recipients){ try { var message = new EmailMessage { Subject = subject, Body = body, To = recipients }; await Email.ComposeAsync(message); } catch (FeatureNotSupportedException fbsEx) { // Email is not supported on this device } catch (Exception ex) { // Some other exception occurred }}
あなたのアプリがAndroid 10以前をターゲットにしている場合、それはちょうど動作します。 Android 11 のパッケージの可視性では、電子メールを送信しようとすると、Xamarin.Essentials は電子メールをサポートするパッケージを照会して、結果が 0 であることを返そうとします。 この結果、FeatureNotSupportedException
がスローされ、理想的ではありません。 アプリケーションがパッケージに可視性を得るには、AndroidManifest.xml
に queries
のリストを追加する必要があります。
<manifest package="com.mycompany.myapp"> <queries> <intent> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> </intent> </queries></manifest>
複数のインテントを照会したり複数の API を使用する必要がある場合は、それらをすべてリストに追加する必要があります。
<queries> <intent> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="http"/> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https"/> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="smsto"/> </intent></queries>
以上、わずかな設定を行うだけで、Android 11 をターゲットにしたときに、アプリは完璧に動作し続けます。
Learn More
パッケージの可視性に関する Android 11 公式ドキュメントと、もちろん新しく更新された Xamarin.Essentials のドキュメントを必ず参照してください。 最後に、Xamarin.Android 11 のリリース ノートをお読みください。
James Montemagno
Principal Lead Program Manager, .NET Community
フォロー