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
- ¿La mejor manera de ocultar una imagen en android?
- Recortar la imagen ala Google Goggles
- ¿Cómo enviar una foto a Instagram usando mi aplicación de Android?
- Datos Exif TAG_ORIENTATION siempre 0
- Android obtener ruta de la foto sin tomar foto
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.
- Android, subir una foto para alojar en imgur programatically
- Sube una foto a Facebook con Facebook Android SDK en Android
- La orientación de la cámara de Android se inició con la intención ACTION_IMAGE_CAPTURE
- Cómo guardar las fotos tomadas en una carpeta específica?
- ¿Cómo puedo agregar una imagen de contacto dentro de ContentProviderOperation?
- Android: subir fotos
- Longitud y latitud del GPS de la foto geotiquetada
- Declarado constante para el tamaño de la foto de contacto de Android?
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();
- Cómo incluir la biblioteca http en Android Project utilizando la vista previa M en la construcción de hormigas de Eclipse
- Cómo obtener el tamaño total de la pantalla en un dispositivo android programaticamente