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

时间:2018-06-03 13:51:37

标签: java android imageview android-camera2

我正在开发一个Android应用程序,其中一部分要求用户拍照,用户拍照时将其保存到文件系统并开始新活动以显示最近拍摄的图片。活动开始没有问题,除了它是空白的!

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

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

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

这是另一项活动并检索图像文件;

@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();
            }
        }

[here's what it displays when I take a picture ][1]:

更新:我发现了问题,它在capturePicture()完成之前执行了intent。即使保存文件也需要路径! 所以我改回原来的方式,即改变观点而不是活动。 并添加了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:文件:////storage/0/emulated/0/DCIM/Camera/IMG_20180604_104845.jpg
  3. 已保存:/ storage/0/emulated/0/DCIM/Camera/IMG_20180604_104845.jpg

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

2 个答案:

答案 0 :(得分:0)

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

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

然后,从此代码接收文件路径

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

答案 1 :(得分:0)

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

方法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();


        }

    });