Встроенная камера, использующая дополнительный Медиастор.Дополнительные выходные данные хранят изображения дважды (в моей папке и в папке по умолчанию)
В настоящее время я разрабатываю приложение, которое использует встроенную камеру. Я вызываю этот фрагмент, нажав на кнопку:
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
//Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
path += "/myFolder/myPicture.jpg";
File file = new File( path );
//file.mkdirs();
Uri outputFileUri = Uri.fromFile( file );
//String absoluteOutputFileUri = file.getAbsolutePath();
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(intent, 0);
После съемки с помощью камеры jpgхорошо хранится в sdcard/myFolder/myPicture.jpg, но он также хранится в /sdcard/DCIM/Camera/2011-06-14 10.36.10.jpg, который является путем по умолчанию.
Есть ли способ запретить встроенной камере хранить изображение в папке по умолчанию?
Edit: я думаю, что буду использовать Класс камеры напрямую
3 ответа:
Другой способ, проверенный на android 2.1, - это взять ID или абсолютный путь последнего изображения галереи, после чего вы можете удалить дублированное изображение.
Это можно сделать так:
/** * Gets the last image id from the media store * @return */ private int getLastImageId(){ final String[] imageColumns = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA }; final String imageOrderBy = MediaStore.Images.Media._ID+" DESC"; Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy); if(imageCursor.moveToFirst()){ int id = imageCursor.getInt(imageCursor.getColumnIndex(MediaStore.Images.Media._ID)); String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA)); Log.d(TAG, "getLastImageId::id " + id); Log.d(TAG, "getLastImageId::path " + fullPath); imageCursor.close(); return id; }else{ return 0; } }
И удалить файл:
private void removeImage(int id) { ContentResolver cr = getContentResolver(); cr.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media._ID + "=?", new String[]{ Long.toString(id) } ); }
Этот код был основан на посте: удаление изображения галереи после того, как была сделана фотография с намерением камеры
В то время как ответ от "Ilango J" дает основную идею.. Я думал, что напишу, как я на самом деле это сделал. Временный путь к файлу, который мы устанавливали в intent.putExtra () следует избегать, так как это нестандартный способ для различных аппаратных средств. На HTC Desire (Android 2.2) он не работал, и я слышал, что он работает на других телефонах. Лучше всего иметь нейтральный подход, который работает везде.
Обратите внимание, что это решение (с использованием намерения) требует, чтобы SD-карта телефона Карта доступна и не монтируется на ПК. Даже обычное приложение камеры не будет работать, когда SD-карта подключена к компьютеру.
1) инициируйте намерение захвата камеры. Обратите внимание, я отключил временную запись файлов (нестандартную на разных аппаратных средствах)
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(camera , 0);
2) обработайте обратный вызов и извлеките захваченный путь изображения из объекта Uri и передайте его на Шаг#3
3) клонировать и удалять файл. Смотрите, что я использовал входной поток Uri для чтения содержимого. То же самое можно также прочитать из файла@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case CAPTURE_PIC: { if (resultCode == RESULT_OK && data != null) { Uri capturedImageUri = data.getData(); String capturedPicFilePath = getRealPathFromURI(capturedImageUri); writeImageData(capturedImageUri, capturedPicFilePath); break; } } } } public String getRealPathFromURI(Uri contentUri) { String[] projx = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(contentUri, projx, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); }
capturedPicFilePath
.public void writeImageData(Uri capturedPictureUri, String capturedPicFilePath) { // Here's where the new file will be written String newCapturedFileAbsolutePath = "something" + JPG; // Here's how to get FileInputStream Directly. try { InputStream fileInputStream = getContentResolver().openInputStream(capturedPictureUri); cloneFile(fileInputStream, newCapturedFileAbsolutePath); } catch (FileNotFoundException e) { // suppress and log that the image write has failed. } // Delete original file from Android's Gallery File capturedFile = new File(capturedPicFilePath); boolean isCapturedCameraGalleryFileDeleted = capturedFile.delete(); } public static void cloneFile(InputStream currentFileInputStream, String newPath) { FileOutputStream newFileStream = null; try { newFileStream = new FileOutputStream(newPath); byte[] bytesArray = new byte[1024]; int length; while ((length = currentFileInputStream.read(bytesArray)) > 0) { newFileStream.write(bytesArray, 0, length); } newFileStream.flush(); } catch (Exception e) { Log.e("Prog", "Exception while copying file " + currentFileInputStream + " to " + newPath, e); } finally { try { if (currentFileInputStream != null) { currentFileInputStream.close(); } if (newFileStream != null) { newFileStream.close(); } } catch (IOException e) { // Suppress file stream close Log.e("Prog", "Exception occured while closing filestream ", e); } } }
Попробуйте этот код:
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); //Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String path = Environment.getExternalStorageDirectory().getAbsolutePath(); path += "/myFolder/myPicture.jpg"; File file = new File( path ); //file.mkdirs(); Uri outputFileUri = Uri.fromFile( file ); //String absoluteOutputFileUri = file.getAbsolutePath(); intent.putExtra("output", outputFileUri); startActivityForResult(intent, 0);