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