Как использовать пользовательские разрешения в Android?


у меня есть два приложения.

один объявляет разрешение и имеет один Activity:

часть 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>

второй объявляет, что это использует разрешение

часть AndroidManifest.xml

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

<application

часть 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")));
}

Я устанавливаю приложение, объявляющее разрешение, затем я запускаю второе приложение.

в результате я получить исключение безопасности:

 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
4 53

4 ответа:

Я создал тестовый код, который вы можете использовать и проверить свои разрешения. Есть два приложения PermissionTestClient, который объявляет разрешение и защищает свою деятельность с этим разрешением. Вот его файл манифеста:

<?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>

в файле активности нет ничего особенного, поэтому я не буду показывать его здесь.

приложение PermissionTestServer вызывает действие из PermissionTestClient. Вот его файл манифеста:

<?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>

и Активность:

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

чтобы проверить его, просто удалите uses-разрешение из серверного приложения. Вы получите ошибку нарушения безопасности.

вам нужно создать разрешение в манифесте базы приложения объявляя его исключительно. Например:

<permission android:name="your.namespace.permission.TEST"
    android:protectionLevel="normal" android:label="This is my custom  permission" />

и позже использовать его в нужном приложении, как:

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

Примечание:важно поддерживать порядок, в котором вы устанавливаете свои приложения с пользовательскими разрешениями. то есть вам необходимо установить это приложение первый который объявляет разрешение и позже установить тот, который использует его. Любой нарушение в этом порядке может нарушить использование обычая. разрешения.

определение пользовательского разрешения выполняется с помощью <Permission> тег.. Пожалуйста, перейдите по ссылке ниже, чтобы использовать определенные пользователем разрешения в приложении:

объявление и применение разрешений

Как уже упоминалось в ответах, вы должны также учитывать порядок установки приложений.

Это важно, потому что:

Если приложение, которое запрашивает разрешение (приложение B), установлено перед приложением, которое определяет разрешение (приложение A), то в конкретном устройстве не будет такого определенного разрешения, поэтому ОС вообще не будет запрашивать разрешение.

позже, когда вы установите приложение A и попытаетесь запустить приложение B, последнее не сможет доступ к защищенному компоненту.

одним из обходных путей было бы определить одно и то же пользовательское разрешение в обоих приложениях, A и B, чтобы убедиться, что разрешение существует на устройстве независимо от того, какое приложение установлено первым, поэтому, когда приложение a установлено, разрешение уже будет предоставлено приложению B.

в этом случае, хотя, вы должны убедиться в том, что уровень защиты тот же в обоих объявлениях, потому что это может привести к безопасность риск.

(обратите внимание, что с android 5.0 и далее вы не можете определить одно и то же разрешение в нескольких приложениях, за исключением случаев, когда эти приложения подписаны одним и тем же ключом подписи).