Tengo una función de extensión para abrir una intención para mis actividades:
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) } } } Mi targetSdkVersion es 30 . Me da una advertencia en intent.resolveActivity(it) :
Considere agregar una declaración de consultas a su manifiesto cuando llame a este método.
Entonces, ¿qué debo hacer para resolver esta advertencia?
La solución más simple es deshacerse de resolveActivity() . Reemplazar:
packageManager?.let { if (intent.resolveActivity(it) != null) startActivity(intent) else showToast(R.string.application_not_found) }con:
try { startActivity(intent) } catch (ex: ActivityNotFoundException) { showToast(R.string.application_not_found) }Esto le da el mismo resultado con un rendimiento un poco mejor y eliminará la advertencia.
Otra opción sería agregar el permiso QUERY_ALL_PACKAGES . Esto puede hacer que te excluyan de Play Store.
De lo contrario, deberá:
Cree una lista de todas las posibles openIntent() que su aplicación puede realizar
Agregue un elemento <queries> a su manifiesto que enumere todas las posibles estructuras de Intent que desea poder usar con resolveActivity()
Repita este proceso periódicamente, en caso de que agregue nuevos escenarios para openIntent()
Entonces, al iniciar Android 11 (es decir, si su aplicación apunta a Android 11), no todas las aplicaciones serán visibles para su aplicación. Algunas aplicaciones son visibles de forma predeterminada, pero para acceder a otras aplicaciones a través de su aplicación, deberá declarar queries en su manifiesto; de lo contrario, su aplicación no podrá acceder a ellas. Puedes leer sobre eso aquí .
Entonces, si su aplicación tiene como objetivo Android 11 y es para acceder a una aplicación que puede no estar visible de forma predeterminada, querrá agregar queries para ellos en el archivo de manifiesto.
En su caso, esta advertencia no es aplicable, ya que creo que está utilizando intentos implícitos para abrir otras aplicaciones. Mediante intentos implícitos, se puede acceder a otras aplicaciones independientemente de la visibilidad de la aplicación. Si su aplicación tiene como objetivo Android 10 o inferior, puede suprimir la advertencia ya que todas las aplicaciones están visibles de forma predeterminada.
Para suprimir la advertencia de pelusa, puede:
@SuppressLint("QueryPermissionsNeeded") fun Activity.openIntent(action: String?, type: String?, uri: Uri?): Activity { lintOptions { ignore "QueryPermissionsNeeded" }Reemplazar
if (intent.resolveActivity(it) != null)con
if (it.resolveActivity(intent, 0) != null)y la advertencia se habrá ido.