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).
- No se puede resolver Manifest.permission.ACCESS_FINE_LOCATION
- Cómo configurar los permisos para Android Bluetooth
- ADB obtener un permiso denegado a pesar de correr como root
- Android: ¿Cómo puedo "correctamente" crear un archivo de lectura pública?
- ¿Cómo inhabilitar a Google para solicitar permiso para revisar regularmente las aplicaciones instaladas en mi teléfono?
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
- ¿Por qué se rechazan estos permisos?
- Definir un permiso para que aplicaciones de terceros se usen en Android
- Permiso para leer datos de la tarjeta SD
- ¿Cómo puedo bloquear la disponibilidad de mi aplicación para compartirla a través de Bluetooth?
- Google Play muestra el permiso implícito READ_EXTERNAL_STORAGE
- Negación de permiso de Android si otra aplicación no se instala primero
- No se puede resolver el método checkSelfPermission
- Permisos que no funcionan
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())));
- Conexión de dos dispositivos mediante libgdx
- IAB consumePurchase () ya no funciona para la respuesta estática android.test.purchased