在另一个 activity 中显示捕获的图像

Displaying captured image in another activity

我正在开发一个 android 应用程序,它的一部分需要用户拍照,当用户拍照时,它会将照片保存到文件系统并启动一个新的 activity 显示最近拍摄的照片。 activity 开始没有问题,只是它是空白的!

当我通过手动输入路径将路径硬编码为字符串时,图像出现了,这是什么问题?

这是保存文件和创建意图的方法;

capturePicture.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        File f = capturePicture();
        Intent intent = new
        Intent(postSharingActivity.this, settingPostParam.class);
        intent.putExtra("picture", f);
        startActivity(intent);
    }
});

这是另一个activity正在检索图像文件;

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setting_post_param);
        savedImage = findViewById(R.id.savedImage);
        File pic = (File) getIntent().getExtras().get("picture");
        Uri uri = Uri.fromFile(pic);
        Toast.makeText(settingPostParam.this, "+uri.toString(),Toast.LENGTH_LONG)
            .show();
            if (isStoragePermissionGranted()) {
                Picasso.get().load(uri).into(savedImage);
            } else {
                Toast.makeText(settingPostParam.this, "error", Toast.LENGTH_LONG).show();
            }
        }

更新:我发现了问题,它在 capturePicture() 完成之前执行了意图。它甚至在保存文件之前就采用了路径! 所以我改回原来的方式,即改变观点而不是活动。 并添加了 AsyncTask。

 private class myAsyncTask extends AsyncTask<Void,Void,Void>{
    File f;

    @Override
    protected Void doInBackground(Void... voids) {
         f=  capturePicture();
        return null;
    }
    @Override
    protected  void onPostExecute(Void result){
        String rr = f.getAbsolutePath();
        File g=new File(rr);
        Toast.makeText(postSharingActivity.this,"onBloodyClick: "+g.toString(),Toast.LENGTH_LONG).show();
        Uri uri = Uri.fromFile(g);
        Toast.makeText(postSharingActivity.this,"URI :"+uri.toString(),Toast.LENGTH_LONG).show();
        if(isStoragePermissionGranted()){
            savedImage.setImageURI(uri);
            cameraPreviewView.setVisibility(View.GONE);
            postCaptureView.setVisibility(View.VISIBLE);
        } else{
            Toast.makeText(postSharingActivity.this,"error",Toast.LENGTH_LONG).show();
        }
    }
}

这里是 onClickListener

 capturePicture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

      new myAsyncTask().execute();


        }

    });

我测试了,还是一样的问题,Toasts的顺序是:

  1. onBloodyClick: /storage/0/emulated/0/DCIM/Camera/IMG_20180604_104845.jpg

  2. URI:file:////storage/0/emulated/0/DCIM/Camera/IMG_20180604_104845.jpg

  3. 已保存:/storage/0/emulated/0/DCIM/Camera/IMG_20180604_104845.jpg

    第三个在capturePicture()方法中。 我在这里做错了什么?并感谢您的回复。

不要通过intent传递文件对象,传递文件的路径(String)。

 intent.putExtra("picture",f.getAbsolutePath());

然后,从这个代码中接收文件路径

File pic = new File( getIntent().getStringExtras("picture"));

我找到了。 问题出在方法的调用和返回类型上。

doInBackground方法的返回类型和两个方法的params类型,onPostExecute将使用doInBackground方法的结果文件

private class myAsyncTask extends AsyncTask<File,Void,File>{

 @Override
    protected File doInBackground(File... voids) {
     File f = capturePicture();
     return f;
    }
    @Override
    protected  void onPostExecute(File f){

        String rr = f.getAbsolutePath();
        File g=new File(rr);
        Toast.makeText(postSharingActivity.this,"onBloodyClick: "+g.toString(),Toast.LENGTH_LONG).show();
        Uri uri = Uri.fromFile(g);
        Toast.makeText(postSharingActivity.this,"URI :"+uri.toString(),Toast.LENGTH_LONG).show();
        if(isStoragePermissionGranted()){
            savedImage.setImageURI(uri);
            cameraPreviewView.setVisibility(View.GONE);
            postCaptureView.setVisibility(View.VISIBLE);
        } else{
            Toast.makeText(postSharingActivity.this,"error",Toast.LENGTH_LONG).show();
        }

    } 
}

然后在 onClickListener 上指定顺序

capturePicture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

      myAsyncTask task=new myAsyncTask();
      task.doInBackground();
      task.execute();


        }

    });