開啟連結
在 Android 中要開啟連結很簡單:
val context = LocalContext.current
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://www.ruyut.com"))
context.startActivity(intent)
開啟 App
在 Android 中要開啟其他 App 也不難,前提是需要知道他的 package name 。啊要怎麼知道呢?最簡單就是開啟網頁版的 Google Play 商店,找到想要開啟的應用程式,這裡筆者就使用 Google 瀏覽器 Chrome 做示範,看一下上面的連結:連結如下:
https://play.google.com/store/apps/details?id=com.android.chrome
在 ?id= 後面的 com.android.chrome 就是 package name 了,然後再使用下面的程式碼就可以很簡單的開啟 App 了:
val context = LocalContext.current
val packageName = "com.android.chrome"
try {
val packageInfo = context.packageManager.getPackageInfo(packageName, 0)
val intent = context.packageManager.getLaunchIntentForPackage(packageName)
if (intent == null) {
Toast.makeText(context, "App not installed, appPackageName: $packageName", Toast.LENGTH_SHORT).show()
} else {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent)
}
} catch (e: PackageManager.NameNotFoundException) {
Toast.makeText(context, "無法開啟 $packageName 應用程式", Toast.LENGTH_SHORT).show()
}
如果 Android 版本是 Android 11 (API level 30)或以上,則應該怎麼測試都會是「無法開啟應用程式」,getLaunchIntentForPackage 怎麼回傳都會是 null ,為什麼?
這是因為在 Android 11 以後因為安全性問題,預設不會讓你讀取/呼叫其他 App,所以就會什麼都會是 null。
有兩個解決方式,一個是宣告自己需要讀取到手機中所有 App 資訊的權限,這需要讓使用者特別授予權限,並且在 Play Store 上架時也有特別的審核,這裡先跳過。
還有第二種,就是在 AndroidManifest.xml 中宣告需要存取的指定應用程式的名稱,例如下面的範例筆者就一口氣宣告了好幾的 App 的 package name,這樣再次執行時就不會都是 null 了!
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<queries>
<package android:name="com.android.chrome" />
<package android:name="com.google.android.youtube" />
<package android:name="com.google.android.apps.youtube.music" />
<package android:name="com.google.android.calendar" />
</queries>
</manifest>
參考資料:
Android Developers - Declare package visibility needs
Google AdMob Help - Get started Package name (for Android apps) https://www.reddit.com/r/androiddev/comments/u5fn1n/trying_to_get_intents_for_any_package_is_always/?rdt=50339
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com