J'ai deux applications.
On est en train de déclarer l'autorisation et d'avoir un seul Activity
:
Partie de AndroidManifest.xml
<application
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:permission="your.namespace.permission.TEST" >
<activity
Android:name=".DeclaringPermissionActivity"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.BROWSABLE" />
<data Android:scheme="myapp"
Android:Host="myapp.mycompany.com" />
</intent-filter>
</activity>
</application>
Le second déclare qu'il utilise l'autorisation
Partie de AndroidManifest.xml
<uses-sdk Android:minSdkVersion="10" />
<uses-permission Android:name="your.namespace.permission.TEST" />
<application
Partie de Activity
:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("myapp://myapp.mycompany.com/index")));
}
J'installe l'application en déclarant l'autorisation, puis je lance la deuxième application.
En conséquence, je reçois une exception de sécurité:
01-11 09:46:55.249: E/AndroidRuntime(347): Java.lang.RuntimeException: Unable to start activity ComponentInfo{your.namespace2/your.namespace2.UsingPErmissionActivity}: Java.lang.SecurityException: Permission Denial: starting Intent { act=Android.intent.action.VIEW dat=myapp://myapp.mycompany.com/index cmp=your.namespace/.DeclaringPermissionActivity } from ProcessRecord{407842c0 347:your.namespace2/10082} (pid=347, uid=10082) requires your.namespace.permission.TEST
J'ai créé un code de test, vous pouvez l'utiliser et tester vos autorisations. Il existe deux applications PermissionTestClient qui déclarent une autorisation et protègent son activité avec cette autorisation. Voici son fichier manifeste:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.testpackage.permissiontestclient"
Android:versionCode="1"
Android:versionName="1.0" >
<uses-sdk Android:minSdkVersion="10" />
<permission Android:name="com.testpackage.mypermission" Android:label="my_permission" Android:protectionLevel="dangerous"></permission>
<application
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name" >
<activity
Android:permission="com.testpackage.mypermission"
Android:name=".PermissionTestClientActivity"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter >
<action Android:name="com.testpackage.permissiontestclient.MyAction" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
Il n'y a rien de spécial dans le fichier d'activité, je ne le montrerai donc pas ici.
L'application PermissionTestServer appelle l'activité de PermissionTestClient. Voici son fichier manifeste:
<?xml version="1.0" encoding="utf-8"?>
<uses-sdk Android:minSdkVersion="10" />
<uses-permission Android:name="com.testpackage.mypermission"/>
<application
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name" >
<activity
Android:name=".PermissionTestServerActivity"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Et activité:
package com.testpackage.permissiontestserver;
import Android.app.Activity;
import Android.content.Intent;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
public class PermissionTestServerActivity extends Activity {
private static final String TAG = "PermissionTestServerActivity";
/** Called when the activity is first created. */
Button btnTest;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnTest = (Button) findViewById(R.id.btnTest);
btnTest.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Button pressed!");
Intent in = new Intent();
in.setAction("com.testpackage.permissiontestclient.MyAction");
in.addCategory("Android.intent.category.DEFAULT");
startActivity(in);
}
});
}
}
Pour le tester, supprimez simplement uses-permission de l'application serveur. Vous obtiendrez une erreur de violation de sécurité.
Vous devez créer une autorisation dans le manifeste de votre application de base en la déclarant exclusivement. Par exemple:
<permission Android:name="your.namespace.permission.TEST"
Android:protectionLevel="normal" Android:label="This is my custom permission" />
Et plus tard, utilisez-le dans votre application souhaitée en tant que:
<uses-permission Android:name="your.namespace.permission.TEST" />
Remarque: Il est essentiel de conserver l'ordre dans lequel vous installez vos applications avec des autorisations personnalisées. C'est-à-dire que vous devez installer cette application première qui déclare l'autorisation, puis installer celle qui en fait usage. Toute interruption dans cet ordre peut empêcher l'utilisation des autorisations personnalisées .
Comme indiqué dans les réponses, vous devez également prendre en compte l'ordre d'installation des applications.
c'est important parce que:
si l'application qui demande l'autorisation (Application B) est installée avant l'application qui définit l'autorisation (Application A), il n'y aura aucune autorisation définie de ce type sur le périphérique spécifique, de sorte que le système d'exploitation ne demandera pas l'autorisation du tout.
plus tard, lorsque vous installez l’application A et essayez d’exécuter l’application B, celle-ci ne pourra pas accéder au composant sécurisé.
Une solution de contournement consisterait à définir la même autorisation personnalisée dans les applications A, B et B, afin de vous assurer que l'autorisation existe dans le périphérique, quelle que soit l'application installée en premier. Ainsi, lorsque l'application A sera installée, l'autorisation sera déjà accordé à App B.
Dans ce cas, vous devez toutefois vous assurer que le niveau de protection est le même dans les deux déclarations, car cela peut entraîner risque de sécurité.
(Notez ici que depuis Android 5.0 et plus, vous ne pouvez pas définir la même autorisation dans plusieurs applications, sauf lorsque ces applications sont signées avec la même clé de signature).
La définition de l'autorisation personnalisée est effectuée à l'aide de <Permission>
tag .. Veuillez suivre le lien ci-dessous pour utiliser les autorisations définies par l'utilisateur dans l'application: