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í:
- Acceso a la notificación de Android TV
- Ejecutar comandos shell desde el programa android
- Ejecutar una aplicación con permiso de root en Android
- Permiso para escribir en la tarjeta SD android
- OnRequestPermissionsResult se llama infinitamente
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
- ¿Por qué mi aplicación tiene el permiso READ_PHONE_STATE aunque no se ha declarado en el manifiesto?
- ¿Cómo dar permisos / dev / bus / usb para aplicaciones libusb android?
- El permiso ACCESS_COARSE_LOCATION da una precisión de torre celular en Android
- ¿Están gradle tools: selector for permissions works ever?
- BroadcastReceiver permiso para el shell de adb
- Pantalla negra de la cámara Android
- Permiso denegado cuando intento iniciarServicio
- ¿Cómo implementar ContentProvider de sólo lectura?
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.
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í.
- Android N se bloquea en TextAppearanceSpan
- Intención FLAG_GRANT_READ_URI_PERMISSION Uso de FileProvider en Gingerbread