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)
我的targetSdkVersion是30。它给了我一个警告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)
警告就会消失。
因此,从 Android 11 开始(即,如果您的应用面向 Android 11)并非所有应用都对您的应用可见。某些应用程序默认是可见的,但为了通过您的应用程序访问其他应用程序,您必须queries在清单中声明,否则您的应用程序将无法访问它们。你可以在这里阅读。
因此,如果您的应用程序面向 Android 11 并且要访问默认情况下可能不可见的应用程序,您将需要queries在清单文件中为它们添加。
在您的情况下,此警告不适用,因为我相信您正在使用隐式意图打开其他应用程序。使用隐式意图,无论应用程序可见性如何,都可以访问其他应用程序。如果您的应用面向 Android 10 或更低版本,您可以取消警告,因为默认情况下所有应用都是可见的。
要抑制 lint 警告,您可以:
@SuppressLint("QueryPermissionsNeeded")
fun Activity.openIntent(action: String?, type: String?, uri: Uri?): Activity {
Run Code Online (Sandbox Code Playgroud)
lintOptions {
ignore "QueryPermissionsNeeded"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3907 次 |
| 最近记录: |