Подтвердить что ты не робот

Как использовать пользовательские разрешения в 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
4b9b3361

Ответ 1

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

И Действия:

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

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

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