[解決済み] API 30 で intent.resolveActivity は null を返す
質問
見ていると intent.resolveActivity != null ですが、インテントを起動すると ActivityNotFound 例外をスローします。 ブラウザやDeepリンクのあるアプリケーションを開くと書きました。
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-viewer では
が動作します。
.
を解除する必要があります。
intent.resolveActivity
?
どのように解決するのですか?
これは、以下の原因によるものと思われます。 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()
- を実際に呼び出しているのは
PackageManager
query" メソッドを内部で呼び出しています。この変更によって影響を受けるすべてのメソッドと機能を網羅的にリストアップすることは不可能かもしれませんが、おそらく、以下のように仮定するのが安全でしょう。
PackageManager
が関与している場合、新しい制限でその動作を確認するのがよいかもしれないと仮定するのはおそらく安全でしょう。
関連
-
[解決済み】findViewByIDがnullを返す。
-
[解決済み] Android getResources().getDrawable() 非推奨 API 22
-
[解決済み] Androidでデフォルト/内蔵アプリを使わずにJavaMail APIを使ってメールを送信する
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] HttpPostによる画像送信
-
[解決済み] getApplication()、getApplicationContext()、getBaseContext()、someClass.thisの違いと使い分け。
-
[解決済み] Android ConstraintLayout - あるビューを別のビューの上に配置する
-
[解決済み] サポートライブラリのアクションバーをPreferenceActivityに追加するには?
-
[解決済み] ViewPager2でスワイプを無効にするには?
-
[解決済み] WhatsAppでメッセージを送信する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] unexpected element <queries> found in <manifest>" エラーを修正する方法は?
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] Androidの連絡先リストを呼び出すには?
-
[解決済み] Gmailの3分割アニメーションシナリオの完全動作サンプル?
-
[解決済み] ArrayList<MyCustomClass>をJSONArrayに変換する。
-
[解決済み] Android StudioからADBを手動で再起動する方法
-
[解決済み] EditTextの右側のDrawableにonClickListenerを設定する [重複] [重複
-
[解決済み] google-services.jsonって実際何してるの?
-
[解決済み] Android: xml リソースからの整数値
-
[解決済み] ViewPager2でスワイプを無効にするには?