studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android permissions android-manifest

programacion - ¿Cómo usar permisos personalizados en Android?



manual de programacion android pdf (4)

Tengo dos aplicaciones.

Una de ellas es declarar el permiso y tener una sola Activity :

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

El segundo declara que es permiso de uso

Parte de AndroidManifest.xml

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

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

Estoy instalando la aplicación declarando el permiso, luego ejecuto la segunda aplicación.

En un resultado, recibo una excepción de seguridad:

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


Como se menciona en las respuestas, también debe tener en cuenta el orden en que instala las aplicaciones.

esto es importante porque:

si la aplicación que solicita el permiso (aplicación B) está instalada antes de la aplicación que define el permiso (aplicación A), entonces no habrá dicho permiso definido en el dispositivo específico, por lo que el sistema operativo no solicitará el permiso en absoluto.

más adelante, cuando instale la aplicación A y trate de ejecutar la aplicación B, esta última no podrá acceder al componente seguro.

Una solución alternativa sería definir el mismo permiso personalizado en ambas aplicaciones, A y B para asegurarse de que el permiso existe en el dispositivo independientemente de qué aplicación esté instalada primero, de modo que cuando se instale la aplicación A, el permiso ya estará disponible. concedido a la aplicación B.

Sin embargo, en ese caso, debe asegurarse de que el nivel de protección sea el mismo en ambas declaraciones, ya que esto puede generar riesgos de seguridad .

(tenga en cuenta que desde Android 5.0 y en adelante no puede definir el mismo permiso en más de una aplicación, excepto cuando esas aplicaciones están firmadas con la misma clave de firma).


Creé un código de prueba que puede usar y probar sus permisos. Hay dos aplicaciones PermissionTestClient que declaran el permiso y protegen su actividad con este permiso. Aquí está su archivo manifiesto:

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

No hay nada especial en el archivo de actividades, así que no lo mostraré aquí.

La aplicación PermissionTestServer llama a la actividad desde PermissionTestClient. Aquí está su archivo manifiesto:

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

Y actividad:

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

Para probarlo, simplemente elimine el permiso de usos de la aplicación del servidor. Obtendrá un error de violación de seguridad.


Debe crear un permiso en el manifiesto de su aplicación base al declararlo exclusivamente. Por ejemplo:

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

Y luego utilícelo en su aplicación deseada como:

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

Nota: es vital mantener el orden en que instala sus aplicaciones con permisos personalizados. es decir, primero debe instalar la aplicación que declara el permiso y luego instalar el que hace uso de él. Cualquier interrupción en este orden puede romper el uso de la costumbre. permisos


La definición de un permiso personalizado se realiza mediante la etiqueta <Permission> . Siga el enlace a continuación para usar los permisos definidos por el usuario en la aplicación:

Declarar y hacer cumplir los permisos