google for android android-camera android-6.0-marshmallow

for - Android: la cámara no se abre en malvavisco



google camera apk marshmallow arm64 (2)

Por lo tanto, tengo debajo el código que abre la cámara, captura la imagen y la guarda en la tarjeta SD.

public void getPhotoFromCamera() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File mediaStorageDir = new File( Environment.getExternalStorageDirectory() + File.separator + getString(R.string.directory_name_corp_chat) + File.separator + getString(R.string.directory_name_temp) ); if (!mediaStorageDir.exists()) { mediaStorageDir.mkdirs(); } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); try { mediaFile = File.createTempFile( "TEMP_FULL_IMG_" + timeStamp, ".jpg", mediaStorageDir ); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mediaFile)); startActivityForResult(takePictureIntent, PICK_FROM_CAMERA); } catch (IOException e) { e.printStackTrace(); } } private void performCrop(Uri picUri) { try { Intent cropIntent = new Intent("com.android.camera.action.CROP"); cropIntent.setDataAndType(picUri, "image/*"); cropIntent.putExtra("crop", "true"); cropIntent.putExtra("aspectX", 1); cropIntent.putExtra("aspectY", 1); cropIntent.putExtra("outputX", 128); cropIntent.putExtra("outputY", 128); // retrieve data on return cropIntent.putExtra("return-data", true); File mediaStorageDir = new File( Environment.getExternalStorageDirectory() + File.separator + getString(R.string.directory_name_corp_chat) + File.separator + getString(R.string.directory_name_temp) ); if (!mediaStorageDir.exists()) { mediaStorageDir.mkdirs(); } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); try { croppedFile = File.createTempFile( "TEMP_CROPPED_IMG_" + timeStamp, ".jpg", mediaStorageDir ); cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(croppedFile)); startActivityForResult(cropIntent, PIC_CROP); } catch (IOException e) { e.printStackTrace(); } } // respond to users whose devices do not support the crop action catch (ActivityNotFoundException anfe) { // display an error message String errorMessage = "Whoops - your device doesn''t support the crop action!"; Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT); toast.show(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_FROM_CAMERA) { if (resultCode == RESULT_OK) { performCrop(Uri.fromFile(mediaFile)); } else { Log.i("Camera", "result cancel. Hence, deleting file: " + mediaFile.getPath()); Log.i("File deleted ", mediaFile.delete() + ""); } } if (requestCode == PICK_FROM_GALLERY) { if (resultCode == RESULT_OK) { performCrop(data.getData()); } else { Log.i("Gallery", "result cancel"); } } if (requestCode == PIC_CROP) { if (resultCode == RESULT_OK) { imageView.setImageBitmap(BitmapFactory.decodeFile(croppedFile.getAbsolutePath())); if (mediaFile != null) { Log.i("Camera", "result cancel. Hence, deleting file: " + mediaFile.getPath()); Log.i("File deleted ", mediaFile.delete() + ""); } } else { if (croppedFile != null) { Log.i("Camera", "result cancel. Hence, deleting file: " + croppedFile.getPath()); Log.i("File deleted ", croppedFile.delete() + ""); } if (mediaFile != null) { Log.i("Camera", "result cancel. Hence, deleting file: " + mediaFile.getPath()); Log.i("File deleted ", mediaFile.delete() + ""); } } } }

Todo funciona perfectamente como se espera debajo de Android 6.0. Pero no funciona en Android 6.0 Marshmallow. De hecho ni siquiera abre la cámara :(

No sé si tengo que hacer algo especial para el malvavisco. Tampoco recibo ningún tipo de error, puedo publicarlo aquí. Por favor, ayúdame.

Gracias.


Citando a developers.android.com :

A partir de Android 6.0 (nivel de API 23), los usuarios otorgan permisos a las aplicaciones mientras se ejecuta la aplicación, no cuando la instalan. Este enfoque agiliza el proceso de instalación de la aplicación, ya que el usuario no necesita otorgar 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 optar por dar acceso a la aplicación de la cámara a la cámara pero no a la ubicación del dispositivo. El usuario puede revocar los permisos en cualquier momento, yendo a la pantalla de configuración de la aplicación.

Los permisos del sistema se dividen en dos categorías, normales y peligrosas:

  • Los permisos normales no arriesgan directamente la privacidad del usuario. Si su aplicación incluye un permiso normal en su manifiesto, el sistema otorga el permiso automáticamente.

  • Los permisos peligrosos pueden dar acceso a la aplicación a los datos confidenciales del usuario. Si su aplicación incluye un permiso normal en su manifiesto, el sistema otorga el permiso automáticamente. Si enumera un permiso peligroso, el usuario debe dar su aprobación explícitamente a su aplicación.

WRITE_EXTERNAL_STORAGE encuentra en la categoría Peligroso, por este motivo, debe solicitar el permiso al usuario antes de llamar a mediaStorageDir.mkdirs() o File.createTempFile contrario, se puede bloquear con esta excepción:

W/System.err: java.io.IOException: open failed: EACCES (Permission denied) W/System.err: at java.io.File.createNewFile(File.java:939) W/System.err: at java.io.File.createTempFile(File.java:1004) W/System.err: at com.example.MainActivity.getPhotoFromCamera(MainActivity.java:98) W/System.err: at com.example.MainActivity.onCreate(MainActivity.java:48) W/System.err: at android.app.Activity.performCreate(Activity.java:6237) W/System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation. W/System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread. W/System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476 W/System.err: at android.app.ActivityThread.-wrap11(ActivityThread.java) W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102) W/System.err: at android.os.Looper.loop(Looper.java:148) W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5417) W/System.err: at java.lang.reflect.Method.invoke(Native Method) W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit. W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission W/System.err: at libcore.io.Posix.open(Native Method) W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) W/System.err: at java.io.File.createNewFile(File.java:932) W/System.err: ... 15 more


Entonces, cumplí mi tarea como la siguiente:

Para verificar el permiso, creé una clase separada como se muestra a continuación:

public class MarshMallowPermission { public static final int RECORD_PERMISSION_REQUEST_CODE = 1; public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 2; public static final int CAMERA_PERMISSION_REQUEST_CODE = 3; Activity activity; public MarshMallowPermission(Activity activity) { this.activity = activity; } public boolean checkPermissionForRecord(){ int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.RECORD_AUDIO); if (result == PackageManager.PERMISSION_GRANTED){ return true; } else { return false; } } public boolean checkPermissionForExternalStorage(){ int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (result == PackageManager.PERMISSION_GRANTED){ return true; } else { return false; } } public boolean checkPermissionForCamera(){ int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA); if (result == PackageManager.PERMISSION_GRANTED){ return true; } else { return false; } } public void requestPermissionForRecord(){ if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.RECORD_AUDIO)){ Toast.makeText(activity, "Microphone permission needed for recording. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show(); } else { ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.RECORD_AUDIO},RECORD_PERMISSION_REQUEST_CODE); } } public void requestPermissionForExternalStorage(){ if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)){ Toast.makeText(activity, "External Storage permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show(); } else { ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE); } } public void requestPermissionForCamera(){ if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)){ Toast.makeText(activity, "Camera permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show(); } else { ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CAMERA},CAMERA_PERMISSION_REQUEST_CODE); } } }

Entonces, para conseguir

... MarshMallowPermission marshMallowPermission = new MarshMallowPermission(this); ... public void getPhotoFromCamera() { if (!marshMallowPermission.checkPermissionForCamera()) { marshMallowPermission.requestPermissionForCamera(); } else { if (!marshMallowPermission.checkPermissionForExternalStorage()) { marshMallowPermission.requestPermissionForExternalStorage(); } else { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File mediaStorageDir = new File( Environment.getExternalStorageDirectory() + File.separator + getString(R.string.directory_name_corp_chat) + File.separator + getString(R.string.directory_name_images) ); if (!mediaStorageDir.exists()) { mediaStorageDir.mkdirs(); } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); try { mediaFile = File.createTempFile( "IMG_" + timeStamp, /* prefix */ ".jpg", /* suffix */ mediaStorageDir /* directory */ ); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mediaFile)); startActivityForResult(takePictureIntent, PICK_FROM_CAMERA); } catch (IOException e) { e.printStackTrace(); } } } }