Je cherche une solution pour me débarrasser de l'avertissement. Je ne comprends même pas pourquoi cela apparaît. J'ai regardé un exemple de SDK où aucun avertissement n'apparaît.
Au début, voici mon manifeste où je reçois l'avertissement Le service exporté ne nécessite pas d'autorisation :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.example.Android"
Android:versionCode="1"
Android:versionName="1.0" >
<uses-sdk Android:minSdkVersion="8"
Android:targetSdkVersion="15" />
<uses-feature Android:name="Android.hardware.camera"
Android:required="true" />
<uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
<uses-permission Android:name="Android.permission.USE_CREDENTIALS" />
<uses-permission Android:name="Android.permission.MANAGE_ACCOUNTS" />
<uses-permission Android:name="Android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission Android:name="Android.permission.READ_SYNC_SETTINGS" />
<uses-permission Android:name="Android.permission.WRITE_SYNC_SETTINGS" />
<application
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/Theme.Sherlock">
<service
Android:name=".AuthenticationService"
Android:exported="true">
<intent-filter>
<action
Android:name="Android.accounts.AccountAuthenticator" />
</intent-filter>
<meta-data
Android:name="Android.accounts.AccountAuthenticator"
Android:resource="@xml/authenticator" />
</service>
<activity
Android:name=".Test"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
...
Alors que SampleSyncAdapter du Android SDK a ce manifeste:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.example.Android.samplesync"
Android:versionCode="1"
Android:versionName="1.0">
<uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
<uses-permission Android:name="Android.permission.USE_CREDENTIALS" />
<!-- ... -->
<uses-sdk Android:minSdkVersion="8" Android:targetSdkVersion="15" />
<application
Android:icon="@drawable/icon"
Android:label="@string/label">
<!-- The authenticator service -->
<service
Android:name=".authenticator.AuthenticationService"
Android:exported="true">
<intent-filter>
<action
Android:name="Android.accounts.AccountAuthenticator" />
</intent-filter>
<meta-data
Android:name="Android.accounts.AccountAuthenticator"
Android:resource="@xml/authenticator" />
</service>
...
Mais il n'y a aucun avertissement. Pourquoi diable ai-je un avertissement? Eh bien, j'utilise le thème Theme.Sherlock pour l'utilisation du ActionBarSherlock . Mais je ne peux pas imaginer que cela provoque l'erreur.
L'avertissement vous indique que vous avez exporté (c'est-à-dire: rendu public) un service sans le sécuriser avec une autorisation. Cela rend votre service disponible pour toutes les autres applications sans restrictions. Voir Le service exporté ne nécessite pas d'autorisation: qu'est-ce que cela signifie?
Si votre service n'a pas besoin d'être disponible pour d'autres applications, vous n'avez pas besoin de l'exporter. Définition explicite de Android:exported="false"
supprimera l'avertissement.
Remarque: La valeur par défaut pour Android:exported
est true
si vous avez fourni un filtre d'intention.
Vous devez ajouter une exigence d'autorisation pour votre service. Celui dont vous avez besoin est Android.permission.ACCOUNT_MANAGER
. Votre authentificateur est uniquement accessible via le gestionnaire.
Concernant ce problème, il existe déjà un bogue créé dans Android concernant cet avertissement à l'aide de "Sync Adapter": https://code.google.com/p/Android/issues/detail? id = 3728 mais c'est toujours un bogue ouvert.