web-dev-qa-db-fra.com

«L'activité exportée ne nécessite pas d'autorisation» lors d'une tentative de lancement à partir d'un URI

J'essaie de lancer une application Android à partir d'un URI en utilisant cette SO question comme référence).

J'ai un fichier manifeste avec l'activité déclarée suivante:

<activity Android:name=".MainActivity">
    <intent-filter>
        <action Android:name="Android.intent.action.VIEW" />
        <data Android:scheme="http" Android:Host="example.com" />
    </intent-filter>
</activity>

J'essaie de lancer MainActivity avec le lien http://example.com . Mon problème est que je reçois l'avertissement

"exported activity does not require permission"

J'ai regardé d'autres SO questions qui signalent ce même avertissement et toutes les solutions ne semblent pas fonctionner.

Comment écrire correctement le filtre d'intention d'activité pour éviter l'avertissement?

Merci

36
Brad

J'ai eu le même problème lorsque j'ai mis à jour le SDK vers la version 20 . Je l'ai supprimé en ajoutant Android: exporté propriété:

<activity 
  Android:name=".MainActivity"
  Android:exported="false">
    <intent-filter>
        <action Android:name="Android.intent.action.VIEW" />
        <data Android:scheme="http" Android:Host="example.com" />
    </intent-filter>
</activity>

à l'intérieur de la déclaration d'activité dans le manifeste. Bien sûr, vous pouvez le spécifier si l'activité est destinée uniquement à un usage interne à l'application

La raison pour laquelle il le corrige se trouve sur docs :

Android: exporté : la valeur par défaut dépend si l'activité contient des filtres d'intention. L'absence de filtres signifie que l'activité ne peut être invoquée qu'en spécifiant son nom de classe exact. Cela implique que l'activité est destinée uniquement à un usage interne à l'application (car d'autres ne connaissent pas le nom de la classe). Dans ce cas, la valeur par défaut est "false". En revanche, la présence d'au moins un filtre implique que l'activité est destinée à un usage externe, donc la valeur par défaut est "true" .

Puisque "Le récepteur exporté ne nécessite pas d'autorisation" (au moins le message LINT est clair), vous l'avez compris.

91
Shine

Avez-vous essayé de nettoyer votre projet (Projet> Nettoyer ...)? Il a corrigé cet avertissement pour mon projet, peut-être le vôtre.

40
cleroo

Pour vous débarrasser de cet avertissement, vous avez deux choix:

  • Soit vous définissez l'attribut Android:exported="false" sur l'activité pour empêcher d'autres applications d'appeler votre activité par une intention
  • Ou si permettant à d'autres applications d'appeler votre activité est ce que vous voulez, vous devez ajouter un Android:permission attribut où vous pouvez spécifier les autorisations dont une application doit disposer pour appeler votre activité.
  • Si vous souhaitez autoriser d'autres applications à appeler votre activité sans autorisation spéciale, vous devez vous entendre avec un avertissement dans le manifeste.

Vous pouvez obtenir plus d'informations dans la Documentation Android .

Merci à @ furykid pour les liens.

18
white_gecko