[Kotlin] Android 開啟連結與第三方 App

開啟連結

在 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

留言