Android: permisos de cámara negados sin preguntar
Yo estaba corriendo en problemas con el proceso manual detrás de la solicitud de permisos (simplemente cayó en el código "denegado"), así que cambié a usar Dexter para simplificar. Implementé el siguiente código en onCreate (), e hice una nueva instalación de la aplicación:
Dexter.withActivity(this) .withPermission(Manifest.permission.CAMERA) .withListener(new PermissionListener() { @Override public void onPermissionGranted(PermissionGrantedResponse response) { Log.d(TAG, "GRANTED!"); initCamera(); } @Override public void onPermissionDenied(PermissionDeniedResponse response) { Log.d(TAG, "DENIED!"); } @Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) { Log.d(TAG, "PERMISSION RATIONAL SHOULD BE SHOWN!"); } }).check();
Inmediatamente cae en el "NEGADO!" Log, y ni siquiera me pide. He intentado este código en particular para intentar múltiples permisos (que es lo que tengo que hacer):
- Solicitud de permiso de cámara con Android SDK 23
- Obtener / modificar marcos mientras graba mp4 con MediaRecorder
- Cámara - cambios de vista previa después de iniciar la grabación de vídeo
- Transmisión de cámara en vivo en Android
- Lista de tamaños de imagen de cámara compatibles
Dexter.withActivity(activity) .withPermissions(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE) .withListener(new MultiplePermissionsListener() { @Override public void onPermissionsChecked(MultiplePermissionsReport report) { Log.d(TAG, "Accepted: " + report.getGrantedPermissionResponses().size() + " | Denied: " + report.getDeniedPermissionResponses().get(0).getPermissionName()); } @Override public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) { Log.d(TAG, "continuing permissions request.."); token.continuePermissionRequest(); } }) .check();
Pide permisos para Grabar audio, luego pregunta sobre el acceso a fotos / medios / archivos en el dispositivo (nunca pregunta acerca de la cámara). Luego, una vez hecho esto, se imprime el registro: "Aceptado 3 | Denegado: android.permission.CAMERA". Lo niega sin siquiera me incitar de nuevo.
Mi Manifiesto está configurado correctamente para tener la CÁMARA en el lugar apropiado (fuera de la etiqueta 'aplicación'). Vea a continuación para referencia:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.my.app"> <uses-feature android:name="android.hardware.camera" android:required="true" /> <permission android:name="${applicationId}.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> etc..
Lo curioso es que cuando entro en Configuración> Aplicaciones> MyApp, la opción Cámara ni siquiera se muestra allí.
No creo que sea un problema con Dexter, ya que está haciendo básicamente lo mismo cuando lo configuro manualmente (y confirmé que definitivamente está configurado correctamente en ese caso después de mirar unos cuantos posts SO).
¿Alguna idea sobre lo que el problema podría estar aquí? FYI – Estoy usando un Galaxy S6, OS 6.0.2. Los otros usuarios que experimentan esto parecen ser otros dispositivos con sistema operativo 6.0+. ¡Gracias por adelantado!
EDIT: Prueba de varios dispositivos, funciona en algunos y no funciona en algunos:
- Moto X (OS 5.0) – Roto
- Nexus 5 (OS 7.0) – Trabajos
- Samsung S6 (OS 6.0.1) – roto
- Broken Moto X (OS 6.0) – Obras
No parece ser un patrón sólido. Definitivamente extraño. También comencé un nuevo proyecto y funcioné con el mismo código – funcionó bien y permitió el acceso a mi cámara. Por lo tanto, no parece ser totalmente específico del dispositivo.
- Android Image Redimensionamiento y conservación de datos EXIF (orientación, rotación, etc.)
- USB bulkTransfer entre la tableta Android y la cámara
- Girar rápidamente el teléfono 180 grados, la vista previa de la cámara gira al revés
- La calidad de vista previa de la cámara en Android es mala
- Programación Android Camera.PreviewCallback (con OpenGL y OpenCV)
- Llamar a la cámara desde una actividad, capturar una imagen y cargarla en un servidor
- ¿Cómo obtener el resultado de la cámara como un uri en la carpeta de datos?
- ¿Cómo puedo reemplazar la imagen de mapa de bits después de girar la imagen original almacenada en cualquier lugar en el móvil?
El problema con esto resultó ser una biblioteca de terceros, que tenía esta línea en su Manifiesto, sobrepasando nuestro propio permiso:
<uses-permission android:name="android.permission.CAMERA" tools:node="remove" />
La solución era importar manualmente su proyecto como un módulo (en lugar de utilizar gradle), y luego comentar esa línea, O más simple: puede agregar "tools: node =" replace "" al final de la CAMERA del proyecto principal Línea de permiso, y funciona bien después de eso; No es necesario importar el proyecto con este último enfoque.
Lo que necesita son los permisos nativos de tiempo de ejecución no dexter, a partir de Android 6.0 (API nivel 23), los usuarios conceden permisos a las aplicaciones mientras se ejecuta la aplicación, no cuando instalan la aplicación. Este enfoque agiliza el proceso de instalación de la aplicación, ya que el usuario no necesita conceder permisos cuando instala o actualiza la aplicación. También le da al usuario más control sobre la funcionalidad de la aplicación; Por ejemplo, un usuario puede elegir dar acceso a una cámara a la cámara, pero no a la ubicación del dispositivo. El usuario puede revocar los permisos en cualquier momento, accediendo a la pantalla Configuración de la aplicación.
// Assume thisActivity is the current activity int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.YOUR_PERMISSION);
Entonces lo que usted necesita es solicitar un cierto permiso si ese cheque es falso,
ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.YOUR_PERMISSION}, MY_PERMISSION_CODE);
Desnudo en el ind que usted necesita también declararlos también en el manifiesto, basado en lo que usted ha demostrado todavía que fue hecho ya. Para obtener más información .
- ¿Cómo puedo obtener el tamaño de la ventana de la aplicación Android y no el tamaño de la pantalla física?
- Android: El editor XML predeterminado ya no se abre