Captura de imagen sin permiso con Android 6.0

Tengo que dejar que el usuario tome una foto (de la galería o de una aplicación de cámara) con Android 6.0.

Debido a que no necesito controlar la cámara, quería usar una intención como describir aquí:

Sin embargo, si no necesita dicho control, sólo puede utilizar una intención ACTION_IMAGE_CAPTURE para solicitar una imagen. Al iniciar la intención, se le pide al usuario que elija una aplicación de cámara (si aún no existe una aplicación de cámara predeterminada) y esa aplicación toma la fotografía. La aplicación de cámara devuelve la imagen al método onActivityResult () de la aplicación.

Https://developer.android.com/preview/features/runtime-permissions.html

Pero para esto ACTION_IMAGE_CAPTURE , necesitas llenar el "MediaStore.EXTRA_OUTPUT" adicional que es un Uri a un archivo temporal (sin este parámetro tendré sólo una miniatura). Este archivo temporal debe estar en el almacenamiento externo (para ser accesible por la aplicación de cámara). Necesita el permiso WRITE_EXTERNAL_STORAGE para crear un archivo en el almacenamiento externo.

Por lo tanto, no es posible capturar una imagen a través de cuadros de diálogo / aplicaciones nativos sin el permiso android.permission.CAMERA o android.permission.WRITE_EXTERNAL_STORAGE . ¿Es eso correcto?

Gracias

Es posible que en android 4.4+, especifique MediaStore.EXTRA_OUTPUT, que sea un archivo en sus directorios específicos de paquetes

A partir de Android 4.4, el propietario, el grupo y los modos de archivos de los dispositivos de almacenamiento externos ahora se sintetizan en función de la estructura de directorios. Esto permite a las aplicaciones administrar sus directorios específicos de paquetes en el almacenamiento externo sin necesidad de tener el amplio permiso WRITE_EXTERNAL_STORAGE. Por ejemplo, la aplicación con nombre de paquete com.example.foo ahora puede acceder libremente a Android / data / com.example.foo / en dispositivos de almacenamiento externo sin permisos. Estos permisos sintetizados se realizan envolviendo dispositivos de almacenamiento sin procesar en un daemon FUSE.

https://source.android.com/devices/storage/

Prueba esto:

 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File file = new File(getActivity().getApplicationContext().getExternalFilesDir(android.os.Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + "yourPicture.jpg"); Uri uri = Uri.fromFile(file); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, url); 

Esto le da acceso a un almacenamiento "externo" para aplicaciones de cámara en este caso, pero los archivos son sólo visibles desde su aplicación. Para aprender un poco más acerca de los espacios de almacenamiento en android, consulte https://www.youtube.com/watch?v=C28pvd2plBA

Espero que te ayude!

Dado que la aplicación de cámara no puede acceder a los directorios privados de tu aplicación, es tu deber de aplicaciones escribir el archivo de fotos en ese directorio. No estoy realmente seguro acerca de esto, pero esto funciona para mí:

 private File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()) .format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); return File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); } Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { // Create the File where the photo should go File photoFile = null; try { photoFile = createImageFile(); takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath); } catch (IOException ex) { // Error occurred while creating the File Log.e(TAG, "Unable to create Image File", ex); } // Continue only if the File was successfully created if (photoFile != null) { takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); } else { takePictureIntent = null; } } 

Pero todavía necesitas permiso WRITE_EXTERNAL_STORAGE antes de KITKAT:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" /> 

Esto es posible sin los permisos CAMERA y WRITE_EXTERNAL_STORAGE .

Puede crear un archivo temporal en el directorio de caché de la aplicación y darle acceso a otras aplicaciones. Eso hace que el archivo sea grabable por la aplicación de cámara:

 File tempFile = File.createTempFile("photo", ".jpg", context.getCacheDir()); tempFile.setWritable(true, false); 

Ahora solo necesitas pasar este archivo como archivo de salida para la intención de la cámara:

 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempFile)); // pass temp file startActivityForResult(intent, REQUEST_CODE_CAMERA); 

Nota: el archivo Uri no se pasará a usted en el resultado de la actividad, tendrá que mantener una referencia a la tempFile y recuperar de allí.

  • Utilice la biblioteca de RootTools de android para obtener permiso android.permission.STATUS_BAR
  • Cómo recibir una emisión cuando la aplicación se instala o se elimina
  • Android: Crear nuevo permiso del sistema a través del código fuente de AOSP.
  • Android INJECT_EVENTS permiso
  • Android Studio IDE en Mac os: error = 13, Permiso denegado
  • SecurityException: Permiso Negación: lectura (sólo en emulador)
  • Android "No se encontró proveedor de contenido ni se revocó el permiso" con android 4
  • Advertencias Su apk está utilizando permisos que requieren una política de privacidad: (android.permission.READ_PHONE_STATE)
  • Permiso de micrófono
  • Obtener permiso error java.lang.SecurityException: Permiso de denegación en 3.x dispositivos Android al obtener el nombre del archivo adjunto de correo electrónico
  • Titanium SDK 5.1.2 - Permisos de Android 6.0
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.