MediaStore.EXTRA_OUTPUT отображает данные в нуле, другой способ сохранить фотографии?

Google предлагает этот универсальный код для фотографирования с намерением:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // create Intent to take a picture and return control to the calling application Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name // start the image capture Intent startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); } 

Проблема в том, что, если вы похожи на меня, и вы хотите передать фотографии как дополнительные, использование EXTRA_OUTPUT похоже, убегает с EXTRA_OUTPUT и делает последующие действия, EXTRA_OUTPUT что данные о намерении EXTRA_OUTPUT нулю.

Похоже, это большая ошибка с Android.

Я пытаюсь сделать снимок, а затем отобразить его в виде миниатюры в новом представлении. Я хотел бы сохранить его в виде полноразмерного изображения в галерее пользователя. Кто-нибудь знает способ указать местоположение изображения без использования EXTRA_OUTPUT ?

Вот что у меня есть сейчас:

 public void takePhoto(View view) { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); startActivityForResult(takePictureIntent, CAMERA_REQUEST_CODE); } /** Create a file Uri for saving an image or video */ private static Uri getOutputMediaFileUri(int type){ return Uri.fromFile(getOutputMediaFile(type)); } /** Create a File for saving an image or video */ @SuppressLint("SimpleDateFormat") private static File getOutputMediaFile(int type){ File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), "JoshuaTree"); if (! mediaStorageDir.exists()){ if (! mediaStorageDir.mkdirs()){ Log.d("JoshuaTree", "failed to create directory"); return null; } } // Create a media file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File mediaFile; if (type == MEDIA_TYPE_IMAGE){ mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_"+ timeStamp + ".jpg"); } else { return null; } return mediaFile; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CAMERA_REQUEST_CODE) { if (resultCode == RESULT_OK) { handleSmallCameraPhoto(data); } } } private void handleSmallCameraPhoto(Intent intent) { Bundle extras = intent.getExtras(); mImageBitmap = (Bitmap) extras.get("data"); Intent displayIntent = new Intent(this, DisplayPhotoActivity.class); displayIntent.putExtra("BitmapImage", mImageBitmap); startActivity(displayIntent); } 

}

Solutions Collecting From Web of "MediaStore.EXTRA_OUTPUT отображает данные в нуле, другой способ сохранить фотографии?"

Если вы указали MediaStore.EXTRA_OUTPUT, сделанное изображение будет записано на этот путь, и никакие данные не будут переданы onActivityResult. Вы можете прочитать изображение из того, что вы указали.

См. Другой вопрос, который был разрешен здесь: Android Camera: намерение данных возвращает null

Вот как вы можете достичь того, чего хотите:

 public void onClick(View v) { switch(v.getId()) { case R.id.iBCamera: File image = new File(appFolderCheckandCreate(), "img" + getTimeStamp() + ".jpg"); Uri uriSavedImage = Uri.fromFile(image); Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); i.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); i.putExtra("return-data", true); startActivityForResult(i, CAMERA_RESULT); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch(requestCode) { case CAMERA_RESULT: if(resultCode==RESULT_OK) { handleSmallCameraPhoto(uriSavedImage); } break; } } private void handleSmallCameraPhoto(Uri uri) { Bitmap bmp=null; try { bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); } catch (FileNotFoundException e) { e.printStackTrace(); } Intent displayIntent = new Intent(this, DisplayPhotoActivity.class); displayIntent.putExtra("BitmapImage", bmp); startActivity(displayIntent); } private String appFolderCheckandCreate(){ String appFolderPath=""; File externalStorage = Environment.getExternalStorageDirectory(); if (externalStorage.canWrite()) { appFolderPath = externalStorage.getAbsolutePath() + "/MyApp"; File dir = new File(appFolderPath); if (!dir.exists()) { dir.mkdirs(); } } else { showToast(" Storage media not found or is full ! "); } return appFolderPath; } private String getTimeStamp() { final long timestamp = new Date().getTime(); final Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(timestamp); final String timeString = new SimpleDateFormat("HH_mm_ss_SSS").format(cal.getTime()); return timeString; } 

Редактировать:

Добавьте их в манифест:

Запуск Api 19 и выше READ_EXTERNAL_STORAGE должно быть объявлено явно

  *<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />* <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

Вам проявляется.

В принципе, есть два способа получить изображение с камеры, если вы используете для отправки захваченного изображения с помощью дополнительных намерений, вы не можете получить его на ActivityResult на aim.getData () ', потому что он сохраняет данные изображения через дополнительные функции.

Итак, идея такова:

 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 

И извлекая его на ActivityResults, проверяя извлеченный замысел:

  @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (resultCode == RESULT_OK) { if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { if (intent.getData() != null) { ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(intent.getData()), "r"); FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor); parcelFileDescriptor.close(); } else { Bitmap imageRetrieved = (Bitmap) intent.getExtras().get("data")); } } } } 

Попробуйте эту android.provider.MediaStore.EXTRA_OUTPUT которая решит вашу ошибку. Для меня работает следующий код:

 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, fileUri); startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 

Я столкнулся с одной и той же проблемой, каждый раз получая нуль при получении данных о другой активности с помощью getIntent().getData() затем решается путем написания полного файла android.provider.MediaStore.EXTRA_OUTPUT это решило мою ошибку.