Intención de la cámara no volver a llamar a la actividad

He leído un montón de preguntas sobre este problema. Algunos son similares a lo que estoy experimentando; He probado las respuestas sin éxito. El código funciona en un HTC Android 4.2 y no funciona en un Nexus 7 Android 4.4. He modificado el directorio de almacenamiento para trabajar en android 4.4, por lo que este no es el problema.

La intención de la cámara nunca vuelve si uso

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 

Y vuelve si uso

 takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoFile); 

Pero no guarda el archivo.

Aquí está el código completo. Llame a la intención

 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(manager) != null) { try { final File photoFile = createImageFile(); if (photoFile != null) { takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); //takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoFile); startActivityForResult(takePictureIntent, 1); } } catch (IOException e) { e.printStackTrace(); } } 

El nombre del archivo

 private File createImageFile() throws IOException { if (mStorageDirectory == null) { createInitialStorageDirectory(); setupFolders(); mScrollList.notifyDataSetInvalidated(); } // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "slide_" + timeStamp; File storageDir = new File(mStorageDirectory); File image = File.createTempFile(imageFileName, ".jpg", storageDir); // image.setWritable(true, false); // Save a path for use with ACTION_VIEW intents mCurrentPhotoPath = image.getAbsolutePath(); return image; } 

La función de devolución de llamada

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == -1) { } } 

El directorio raíz más el directorio save

 static String mBasePath = "/slides/"; private String getRootDirectory() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { if (Build.VERSION.SDK_INT >= 19) return mView.getContext().getFilesDir() + mBasePath; else return Environment.getExternalStorageDirectory() + "/Android/data/com.hdms.manager" + mBasePath; //return Environment.getExternalStorageDirectory() + mBasePath; } return mBasePath; } 

Cualquier pensamiento sería apreciado.

Así que he encontrado una solución a mi problema. Si no existe un archivo, la actividad de la cámara no volverá. Supongo que la razón por la que no funciona en 4.4 es el cambio al sistema de archivos. No estoy guardando la imagen en la galería de medios y cargando el archivo de nuevo en mi directorio de aplicaciones. A continuación, se suprime el archivo multimedia. La razón de que no lo deje en el directorio de medios, es cuando la aplicación se elimina así que las imágenes se eliminarán.

Aquí está el nuevo código. Primero, la llamada intencional

 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(manager) != null) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.TITLE, "New Picture"); values.put(MediaStore.Images.Media.DESCRIPTION,"From your Camera"); Uri mImageUri = App.mApplication.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); mCurrentPhotoPath = mImageUri.getPath(); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); startActivityForResult(takePictureIntent, 1); } 

A continuación, la devolución de llamada.

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == -1) { if (data != null) mCurrentPhotoPath = String.valueOf(data.getData()); String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = App.mApplication.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, filePathColumn, null, null, null); if (cursor == null) return; // find the file in the media area cursor.moveToLast(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String filePath = cursor.getString(columnIndex); File source = new File(filePath); cursor.close(); // create the destination file String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "slide_" + timeStamp; File destination = new File(mStorageDirectory, imageFileName + ".jpg"); // copy the data if (source.exists()) { try { FileChannel src = new FileInputStream(source).getChannel(); FileChannel dst = new FileOutputStream(destination).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); source.delete(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } } 

En mi caso, no volvió porque el archivo de salida estaba dentro de una carpeta que todavía no he creado.

Si es el caso de otra persona, hágalo antes de iniciar un anentamiento:

 file.getParentFile().mkdirs(); 
  • Detectar si el contacto tiene foto
  • Android - Get Contact Foto del número de teléfono
  • Problemas para tomar fotos con Android (Cámara vertical | Retrato)
  • Asegúrese de que las fotos se guardan con la misma orientación que se tomaron?
  • ¿Cómo puedo mostrar una imagen que acabo de sacar de mi cámara en mi aplicación Android?
  • ¿Cómo tomar una foto y enviar a HTTP POST solicitud con Android?
  • Aumentar la calidad / claridad / brillo de las fotos tomadas con la cámara android
  • Una "Antes y Después" comparación de imágenes Slide Control en Andorid
  • Subir foto / foto / imagen facebook (android)
  • ¿Cómo puedo crear efectos de fotos en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.