Java 如何启动传递图像uri的新活动

Java 如何启动传递图像uri的新活动,java,android,android-activity,Java,Android,Android Activity,我有一个带有按钮的活动,可以打开一个对话框,在拍照或从画廊中选择图片之间进行选择,编码如下: private void showDialogToSelectAFile() { MaterialAlertDialogBuilder dialog = new MaterialAlertDialogBuilder(this); dialog.setTitle("Select a file or take a picture") .setMe

我有一个带有按钮的活动,可以打开一个对话框,在拍照或从画廊中选择图片之间进行选择,编码如下:

private void showDialogToSelectAFile() {
    MaterialAlertDialogBuilder dialog = new MaterialAlertDialogBuilder(this);

    dialog.setTitle("Select a file or take a picture")
            .setMessage("Choose one of the options")
            .setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //do nothing
                }
            }).setPositiveButton("Take a picture", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            openCameraToTakePictureIntent();
        }
    }).setNegativeButton("Select a file from your gallery", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            openGalleryIntent();
        }
    }).show();
}
然后运行以下意图来执行所选操作:

private void openCameraToTakePictureIntent() {
    Log.d(TAG, "Method for Intent Camera started");
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File
        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(this,
                    "com.emergence.domain.fileprovider",
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }

}
现在,我想开始一个新的活动,它将显示图片并允许对此图片进行修改,因此我想在“onActivityResult”中传递URI,但我不知道如何做

到目前为止,它没有崩溃,我可以选择一个图像或拍摄一张照片,但当然,当我这样做时,它只会返回到活动,除了希望将图像存储在文件中之外,什么也不做

我的问题: 是否有更好的方法继续向新活动传递图像,同时保持图像的完整质量? 如果没有,我如何传递此URI并在新活动中检索图像? 我的图像是否实际存储在我创建的文件中

以下是我的createImageFile函数,以防相关:

private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    // Save a file: path for use with ACTION_VIEW intents
    currentPhotoPath = image.getAbsolutePath();
    return image;
}
谢谢你的帮助

编辑:

我已将onActivityResult更新如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == Activity.RESULT_OK && requestCode == 1) {

        Intent intent = new Intent(this, ModifyPictureActivity.class);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, currentPhotoPath);
        startActivity(intent);

}
我创建了这个新的活动,它只有一个ImageView,我想在其中显示图片,但我找不到正确的方法将图片设置为Extras。到目前为止,我有:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_modify_picture);

    Intent intent = getIntent();
    intent.getExtras();

    image = findViewById(R.id.image);

    image.setImageURI(???);

}

我是否应该尝试使用“setImageURI”以外的其他方法设置图像?

实际上,您有两个选项:

  • 如果您想要小尺寸的图像,可以通过解码位图在
    onActivityResult
    回调中获得它
  • 由于您要传入uri,使用
    EXTRA\u OUTPUT
    键,
    MediaStore
    将文件保存到该位置。因此,在
    onActivityResult
    回调中,您只需检查消息是否
    ok
    ,请求代码是否对应,然后您就可以使用
    EXTRA\u OUTPUT
    键从文件中读取传入的URI

  • 在OnActivityResult检查中,如果URI不为null,则将其传递给新活动

        Intent intent = Intent(this, your activity)
        intent.putExtra("uri", uri)
        startActivity(intent)
        
    
    然后在(您的新活动)中,使用这些行获取Uri

       Bitmap photo= BitmapFactory.decodeFile(intent.getStringExtra("uri"))
       imageView.setImageBitmap(photo)
    

    注意:将uri作为字符串传递

    我确实覆盖了onActivityResult,但即使在阅读了android Developer之后,我也真的不知道应该在里面放什么。我猜“数据”是我的图片,但我如何用这些数据开始其他活动是我的问题。好的,多亏了你,我就要接近了,我只需要最后一个帮助。我用onActivityResult函数编辑了我的帖子。你应该使用
    getIntent().getParcelableExtra(一些自定义密钥)
    ,我还建议你使用自定义密钥,而不是
    MediaStore.EXTRA\u输出
    。非常感谢你,我终于在你的建议下实现了。