Mientras intentaba crear un proyecto de pruebas para experimentar con Android, el lanzamiento de la plantilla de Android en un emulador lanzó la falla mencionada de la fusión de los manifiestos: las aplicaciones destinadas a Android 12 y superior deben especificar un valor explícito para android:exported
cuando el componente correspondiente tiene un filtro de intención definido.
Después de investigar un poco, encontré la solución, sin embargo, no estaba tan claro por qué era necesario y por qué apareció la excepción con un nuevo proyecto que debería funcionar automáticamente desde el principio en Android Studio. En este artículo, compartiré contigo la explicación y la solución a esta excepción.
Agregar atributo de android:exported a intents y receptores
Como se menciona en las notas oficiales sobre los cambios de comportamiento para Android 12, específicamente para el componente de seguridad , si su aplicación apunta a Android 12 y contiene actividades , servicios o receptores de transmisión que usan filtros de intención , debe declarar explícitamente el atributo para estas aplicaciones. componentes.android:exported
Este atributo establece si la actividad puede ser iniciada por componentes de otras aplicaciones:
- Si es "
true
", la actividad es accesible para cualquier aplicación y se puede iniciar por su nombre de clase exacto. - Si es "
false
", la actividad solo puede ser iniciada por componentes de la misma aplicación, aplicaciones con el mismo ID de usuario o componentes del sistema con privilegios. Este es el valor predeterminado cuando no hay filtros de intención.
Si una actividad en su aplicación incluye filtros de intención, establezca este elemento en "true
" para permitir que otras aplicaciones lo inicien. Por ejemplo, si la actividad es la actividad principal de la aplicación e incluye la category
"android.intent.category.LAUNCHER
". Si este elemento se establece en "false" y una aplicación intenta iniciar la actividad, el sistema arroja una excepcion ActivityNotFoundException
Este atributo no es la única forma de limitar la exposición de una actividad a otras aplicaciones. Los permisos también se pueden utilizar para limitar las entidades externas que pueden invocar la actividad (ver el atributo permission
):
<!-- O configúralo como verdadero -->
<activity android:name=".MainActivity" android:exported="true">
</activity>
<!-- O configúralo como verdadero -->
<activity android:name=".MainActivity" android:exported="false">
</activity>
Según tus necesidades, esta corrección en tu manifiesto de Android se verá así:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.sandbox">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Sandbox">
<!--
Solución: agrega el atributo android:exported y configúralo en verdadero o falso
a cada actividad o receptor que puedas tener
-->
<activity android:name=".MainActivity" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Que te diviertas ❤️!
Conviertete en un programador más sociable