Comment utiliser les permissions personnalisées dans Android?

j'ai deux applications.

on déclare permission et 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 la permission

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")));
}

je suis installer l'application déclarant la permission, puis j'exécute la deuxième application.

dans un résultat j'obtiens l'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
53
demandé sur Ken Bloom 2012-01-11 13:03:56

4 réponses

j'ai créé un code de test que vous pouvez utiliser et tester vos permissions. Il existe deux applications PermissionTestClient qui déclare la permission et protège son activité avec cette permission. Voici son 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 dossier D'activité donc je ne le montrerai pas ici.

PermissionTestServer appels d'application de l'activité de PermissionTestClient. Voici son 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, il suffit de supprimer uses-permission de L'application Serveur. Vous obtiendrez violation de la sécurité d'erreur.

100
répondu Yury 2012-01-11 09:51:48

vous devez créer une permission dans le manifeste de votre application de base par 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, l'utiliser dans votre application souhaitée comme:

<uses-permission android:name="your.namespace.permission.TEST" />

Note: il est essentiel de maintenir l'ordre dans lequel vous installez vos applications avec des permissions personnalisées. I. e vous devez installer cette application première qui déclare la permission et installez plus tard celui qui s'en sert. Toute perturbation de cet ordre peut casser l'utilisation de la coutume. autorisations.

32
répondu waqaslam 2015-02-03 07:48:25

définir la permission personnalisée est fait en utilisant <Permission> étiquette.. Veuillez suivre le lien ci-dessous pour utiliser les permissions définies par l'utilisateur dans l'application:

de la déclaration et de l'Application des Autorisations

1
répondu Lavakush 2012-01-11 09:24:19

, Comme mentionné dans les réponses, vous devez également prendre en compte l'ordre d'installer les applications.

c'est important parce que:

si l'application qui demande la permission (application b) est installée avant L'application qui définit la permission (application A), alors il n'y aura pas de telle permission définie dans le périphérique spécifique de sorte que L'OS ne demandera pas la permission du tout.

plus tard, lorsque vous installez L'application a et essayez d'exécuter App b, ce dernier ne pourra pas accéder au composant sécurisé.

Une solution de contournement serait de définir la même autorisation personnalisée dans les deux Applications A et B afin de s'assurer que l'autorisation existe dans l'appareil, indépendamment de l'Application qui est installé en premier, de sorte que lorsque l'Application est installée, l'autorisation déjà accordée à l'Application B.

dans ce cas, cependant, vous devez vous assurer que le niveau de protection est le même en les deux déclarations parce que cela peut conduire à risque de sécurité .

(notez ici que d'android 5.0 et sur vous ne pouvez pas définir la même permission dans plus d'une application, sauf si ces applications sont signées avec la même clé de signature).

1
répondu Adam 2017-02-13 20:48:16