intent.resolveActivity は API 30 で null を返します 質問する

intent.resolveActivity は API 30 で null を返します 質問する

見つめているintent.resolveActivity != null ですが、インテントを起動すると ActivityNotFound 例外がスローされますディープリンクを使用してブラウザまたはアプリケーションを開く方法を次のように書きました。

private fun openUrl(url: String) {
    val intent = Intent().apply {
        action = Intent.ACTION_VIEW
        data = Uri.parse(url)
//        setDataAndType(Uri.parse(url), "text/html")
//        component = ComponentName("com.android.browser", "com.android.browser.BrowserActivity")
//        flags = Intent.FLAG_ACTIVITY_CLEAR_TOP + Intent.FLAG_GRANT_READ_URI_PERMISSION
    }
    val activityInfo = intent.resolveActivityInfo(packageManager, intent.flags)
    if (activityInfo?.exported == true) {
        startActivity(intent)
    } else {
        Toast.makeText(
            this,
            "No application can handle the link",
            Toast.LENGTH_SHORT
        ).show()
    }
}

動作しません。API 30エミュレータではブラウザが見つかりませんが、一般的な解決作品:

private fun openUrl(url: String) {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
    try {
        startActivity(intent)
    } catch (e: ActivityNotFoundException) {
        Toast.makeText(
            this,
            "No application can handle the link",
            Toast.LENGTH_SHORT
        ).show()
    }
}

intent.resolveActivityInfo最初の方法は、またはがintent.resolveActivityを返すため機能しませんnull。しかし、PDFビューアの場合は作品

解散すべきでしょうかintent.resolveActivity

ベストアンサー1

これは、Android 11で導入された「パッケージの可視性」に関する新しい制限

基本的に、API レベル 30 以降、そのバージョン以上をターゲットにしている場合、包括的な権限を通じて、またはマニフェストにQUERY_ALL_PACKAGES適切な<queries>要素を含めることによって、明示的に許可を要求しない限り、アプリはほとんどの外部パッケージを表示したり、直接操作したりすることはできません。

実際、最初のスニペットは、その権限、または<queries>マニフェスト内の適切な要素を使用すると期待どおりに動作します。次に例を示します。

<queries>
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="https" />
    </intent>
</queries>

現在入手可能な情報は非常に具体的ではありませんが、次のように述べられています。

他のアプリに関する結果を返すメソッドPackageManager、例えばqueryIntentActivities()は、呼び出し元のアプリの<queries>宣言に基づいてフィルタリングされます

ただし、あなたの例では、実際には内部で「クエリ」メソッドを呼び出すIntentメソッド (つまり、 ) を使用しています。この変更によって影響を受けるすべてのメソッドと機能の完全なリストは実現可能ではないかもしれませんが、が関係している場合は、新しい制限でその動作を確認するのが適切であると想定してもおそらく間違いないでしょう。resolveActivityInfo()PackageManagerPackageManager

おすすめ記事