Как использовать пользовательские разрешения в Android? - PullRequest
56 голосов
/ 11 января 2012

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

Одно объявляет разрешение и имеет одно 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")));
}

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

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

 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 ]

102 голосов
/ 11 января 2012

Я создал тестовый код, который вы можете использовать и проверить свои разрешения.Существует два приложения 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>

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

Приложение 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>

И Activity:

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

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

31 голосов
/ 11 января 2012

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

<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" />

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

3 голосов
/ 13 февраля 2017

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

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

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

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

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

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

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

1 голос
/ 11 января 2012

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

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

...