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, казалось бы, сработает с фотоданными и делает последующие действия, считая, что данные о намерениях равны нулю.

Он появляется, это большая ошибка с 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);
}

}

Ответ 1

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

См. еще один разрешенный здесь вопрос: Камера Android: намерение данных возвращает null

Ответ 2

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

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;
}

Edit:

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

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

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

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

Ответ 3

В принципе, есть два способа получить изображение с камеры, если вы используете для отправки захваченного изображения с помощью дополнительных намерений, вы не можете получить его на 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"));
                
            }
            
        } 
        
    }
    
}

Ответ 4

Попробуйте эту 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, это решило мою ошибку.