【问题标题】:Android map opening from intent and call dialing from intent not working after updating target version to 30 on Android 11 devices在 Android 11 设备上将目标版本更新为 30 后,从意图打开 Android 地图并从意图拨打电话不起作用
【发布时间】:2021-12-14 14:16:53
【问题描述】:

这似乎是 Android 提到的包可见性问题 https://developer.android.com/about/versions/11/privacy/package-visibility

fun Activity.callPlayStoreIntent() {
    val appPackageName = this.packageName
    try {
        val uri = Uri.parse("market://details?id=$appPackageName")
        val intent = Intent(ACTION_VIEW, uri)
        startActivity(intent)
    } catch (exception: ActivityNotFoundException) {
        try {
            val uri = Uri.parse("https://play.google.com/store/apps/details?id=$appPackageName")
            val intent = Intent(ACTION_VIEW, uri)
            startActivity(intent)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}


fun Context.callFromDialer(number: String) {
    try {
        val callIntent = Intent(Intent.ACTION_DIAL)
        callIntent.data = Uri.parse("tel:$number")
        if (callIntent.resolveActivity(packageManager) != null) {
            startActivity(callIntent)
        }
    } catch (e: Exception) {
        e.printStackTrace()
        Toast.makeText(this, "No SIM Found", Toast.LENGTH_LONG).show()
    }
}


fun Context.intentOpenMap(
    latitude: Double,
    longitude: Double,
    label: String,
) {
    try {
        val uriBegin = "geo:$latitude,$longitude"
        val query = "$latitude,$longitude($label)"
        val encodedQuery = Uri.encode(query)
        val uriString = "$uriBegin?q=$encodedQuery&z=20"
        val uri = Uri.parse(uriString)
        val intent = Intent(Intent.ACTION_VIEW, uri)
        if (intent.resolveActivity(packageManager) != null) {
            startActivity(intent)
        }
    } catch (ex: Exception) {
        ex.printStackTrace()
        Toast.makeText(this, "Unable to open Map", Toast.LENGTH_LONG).show()
    }

}

【问题讨论】:

  • 摆脱resolveActivity() 电话。您不需要它们,因为您的 catch 块将处理任何被提升的 ActivityNotFoundExceptions。如果有的话,resolveActivity() 调用似乎在积极地伤害您的用户——如果他们没有匹配的应用程序,您只需悄悄地什么都不做。
  • @CommonsWare 明白了你的意思。这就是它没有显示吐司的原因。

标签: android android-intent android-11


【解决方案1】:

您的问题在于代码行intent.resolveActivity(getPackageManager())。当你调用resolveActivity时,你会得到这样的警告:

考虑在调用此方法时向您的清单添加声明;详情见https://g.co/dev/packagevisibility

查看PackageManager下的文档,你会看到这个注释:

注意:如果您的应用面向 Android 11(API 级别 30)或更高版本,则此类中的每个方法都会返回经过过滤的应用列表。详细了解如何管理包的可见性。

那是什么意思?

在 android 11 中,Google 添加了包可见性策略。应用程序现在可以更严格地控​​制查看其他应用程序。您的应用程序将无法查看或访问您的应用程序之外的应用程序。

你需要做什么?

您需要做的就是将下面的代码行添加到AndroidManifest.xml

<manifest>
    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <data android:scheme="geo" />
        </intent>

        <intent>
            <action android:name="android.intent.action.VIEW" />
            <data android:scheme="market" />
        </intent>

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

        <intent>
            <action android:name="android.intent.action.DIAL" />
        </intent>
    </queries>
</manifest>

更多信息:

  1. Package visibility in Android 11
  2. Package visibility filtering on Android

【讨论】:

  • 嘿,这个解决方案非常有效。如果我们有多个具有相同操作但数据方案不同的意图,我们是否应该在 块中添加多个意图。
  • @HamzaKhan 是的。您可以在一个应用程序中有多个意图查询。只要您访问的应用程序不是您自己的应用程序,那么您应该添加&lt;intent&gt; 查询以防您有意打开该应用程序或添加&lt;package&gt; 如果您使用包名称打开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 2023-03-04
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多