在 android 11 中使用 intent.resolveActivity 调用此方法时,请考虑在清单中添加查询声明

Sam*_*ari 16 android kotlin android-11

我有一个扩展功能,用于为我的活动打开一个意图:

fun Activity.openIntent(action: String?, type: String?, uri: Uri?) {
    Intent()
        .apply {
            action?.let { this.action = it }
            uri?.let { this.data = it }
            type?.let { this.type = it }
        }
        .also { intent ->
            packageManager?.let {
                if (intent.resolveActivity(it) != null)
                    startActivity(intent)
                else
                    showToast(R.string.application_not_found)
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

我的targetSdkVersion30。它给了我一个警告intent.resolveActivity(it)

调用此方法时,请考虑向清单添加查询声明。

那么我应该怎么做才能解决这个警告呢?

Com*_*are 16

最简单的解决方案是摆脱resolveActivity(). 代替:

            packageManager?.let {
                if (intent.resolveActivity(it) != null)
                    startActivity(intent)
                else
                    showToast(R.string.application_not_found)
            }
Run Code Online (Sandbox Code Playgroud)

和:

            try {
                startActivity(intent)
            } catch (ex: ActivityNotFoundException) {
                showToast(R.string.application_not_found)
            }
Run Code Online (Sandbox Code Playgroud)

这为您提供了相同的结果和更好的性能,并且它会消除警告。

另一种选择是添加QUERY_ALL_PACKAGES权限。这可能会导致您被禁止使用 Play 商店。

否则,您将需要:

  • openIntent()您的应用可能进行的每个可能调用建立一个列表

  • <queries>向清单添加一个元素,列出Intent您希望能够使用的所有可能的结构resolveActivity()

  • 定期重复此过程,以防您为 openIntent()


Tat*_*aki 10

代替

if (intent.resolveActivity(it) != null)
Run Code Online (Sandbox Code Playgroud)

if (it.resolveActivity(intent, 0) != null)
Run Code Online (Sandbox Code Playgroud)

警告就会消失。


Key*_*öze 7

因此,从 Android 11 开始(即,如果您的应用面向 Android 11)并非所有应用都对您的应用可见。某些应用程序默认可见的,但为了通过您的应用程序访问其他应用程序,您必须queries在清单中声明,否则您的应用程序将无法访问它们。你可以在这里阅读。

因此,如果您的应用程序面向 Android 11 并且要访问默认情况下可能不可见的应用程序,您将需要queries在清单文件中为它们添加。

在您的情况下,此警告不适用,因为我相信您正在使用隐式意图打开其他应用程序。使用隐式意图,无论应用程序可见性如何,都可以访问其他应用程序。如果您的应用面向 Android 10 或更低版本,您可以取消警告,因为默认情况下所有应用都是可见的。

要抑制 lint 警告,您可以:

  1. 添加抑制注释,如下所示:
@SuppressLint("QueryPermissionsNeeded")
fun Activity.openIntent(action: String?, type: String?, uri: Uri?): Activity {
Run Code Online (Sandbox Code Playgroud)
  1. 将以下内容添加到您的应用程序模块构建 gradle 文件中的 android 块中:
lintOptions {
    ignore "QueryPermissionsNeeded"
}
Run Code Online (Sandbox Code Playgroud)