Cómo resolver el error de Android: Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined

Cómo resolver el error de Android: Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined

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 ❤️!

Esto podria interesarte

Conviertete en un programador más sociable