Android checkCallingOrSelfPermission no devuelve correctamente

Estoy escribiendo un servicio que necesita ver si su llamador tiene un permiso particular privado. No quiero evitar que los llamantes que carecen de este permiso, sólo quiero saber el estado para que pueda reaccionar en consecuencia. Parecería que el método de contexto checkCallingPermission() es perfecto para lo que necesito, devolviendo 0 si el llamador tiene el permiso especificado y -1 de lo contrario. Estoy encontrando que -1 se devuelve en todos los casos sin embargo.

Escribí un caso de prueba (utilizando el método similar checkCallingOrSelfPermission() en el que checkCallingOrSelfPermission() PackageInfo de mi paquete del sistema, enumeré cada uno de mis permisos (sólo uno solicitado para el paquete) y mostrar el resultado de checkCallingOrSelfPermission() Estoy comprobando en este caso son exactamente los permisos que tengo, espero que checkCallingOrSelfPermission() para devolver 0 (PackageManager.PERMISSION_GRANTED) sólo … comprar sólo devuelve -1 (PackageManager.PERMISSION_DENIED).

He comprobado esto y recibió los mismos resultados en un emulador 4.0 y un dispositivo 2.3.

¿Alguna idea de lo que estoy haciendo mal para hacer que estas llamadas fallen?

Mi manifiesto de prueba incluye:

 <permission android:protectionLevel="signatureOrSystem" android:name="abcd" /> <uses-permission android:name="abcd" /> 

Mi código de actividad de prueba es:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); PackageManager pm = getPackageManager(); try { PackageInfo pi = pm.getPackageInfo("com.test.check", PackageManager.GET_PERMISSIONS); if ((null == pi.requestedPermissions) || (pi.requestedPermissions.length == 0)) { Log.d("CHECK", "Package has NO permissions!"); finish(); return; } for (int i = 0; i < pi.requestedPermissions.length; ++i) { Log.d("CHECK", pi.requestedPermissions[i] + " " + checkCallingOrSelfPermission(pi.requestedPermissions[i])); } } catch (NameNotFoundException e) { Log.d("CHECK", "Package name is wrong!"); } finish(); } 

Y los resultados de mi prueba son:

 D/CHECK ( 3600): abcd -1 

No he podido resolver esto dentro del alcance de mi servicio que necesita comprobar permisos, pero he encontrado un work-around para el servicio (y un problema en mi caso de prueba).

Mi caso de prueba falló porque el permiso que creé y comprobé con "abcd", fue cambiado de nombre por Android en la entrada <permission>, sin embargo, Android falló al cambiar el mismo nombre en la entrada <uses-permission>. Se renombró para tener mi nombre de paquete adjunto a él (y este cambio de nombre no ocurre si proporciono un nombre incluyendo un período en él, tal como "test.abcd").

Aunque cambiar el nombre de permiso fijó mi caso de prueba, mi caso real dentro de un servicio ya estaba usando un nombre de permiso completo y checkCallingPermission() continúa fallando. Descubrí, sin embargo, que el método checkPermission() PackageManager funciona como se esperaba (a expensas de mi necesidad de recuperar el nombre del paquete de la persona que llama).

Así que para resumir, lo siguiente no funciona correctamente (aunque no sé por qué):

 boolean permission = (PackageManager.PERMISSION_GRANTED == checkCallingPermission(PERMISSION_NAME)); 

Mientras que esto parece funcionar correctamente:

 PackageManager pm = getPackageManager(); boolean permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission(PERMISSION_NAME, pm.getNameForUid(getCallingUid()))); 
  • Android permission.INTERACT_ACROSS_USERS_FULL
  • Java socket IOException - permiso denegado
  • ¿Es posible eliminar permisos de una aplicación de Android?
  • Permisos para Android: ¿Cómo puedo saber cuáles son peligrosos frente a lo normal?
  • ¿Cómo obtener la configuración del permiso de aplicación en android?
  • Enlace entre permisos de Android y grupos de permisos
  • Obtener: No se permite iniciar el servicio Intención ... sin permiso Proceso de servicio es malo
  • ¿Android seguirá utilizando GPS para extraer la ubicación cuando se solicite sólo COARSE_LOCATION?
  • ¿Puedo incluir el nombre del permiso en la cadena res
  • Init.rc no iniciar mi servicio en el primer arranque después del flash
  • "DIBUJAR SOBRE OTRA APLICACIÓN" es qué permiso en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.