打开相机应用并通过意图在SD卡上保存照片,并在imageView中显示

5

可能重复:
在安卓中使用相机并将拍摄结果保存到SD卡中

我想从相机应用程序中获取图片,将其保存在SD卡上并设置imageView。 我编写了以下代码。 保存和imageView有时可以工作。 但是有时候图片保存在SD卡上,但imageView不起作用。

当imageView不起作用时,在onActivityResult中mOutUri似乎变为null。

我尝试在clkbutton中将mOutUri保存在SharedPreferences中。 我可以在onActivityResult中看到uri,但imageView不起作用。 此时,mOutUri也为null。

public void clkbutton(View v){
    Intent intent = new Intent();

    // open camera app
    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);

    // save data in SD card
    Date date = new Date();
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd-kk-mm-ss");
    String newPicFile = df.format(date) + ".jpg";
    mNewPicFile = newPicFile;
    String outPath = "/sdcard/" + newPicFile;
    File outFile = new File(outPath);
    mOutUri = Uri.fromFile(outFile);

    intent.putExtra(MediaStore.EXTRA_OUTPUT, mOutUri);       
    startActivityForResult(intent, REQUEST_CAPTURE_IMAGE);
}


 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    ImageView imageView = (ImageView) findViewById(R.id.image_view);
    imageView.setImageURI(mOutUri);    
 }

有时候它会出错,有时候又可以正常工作,这真是太奇怪了。
2个回答

0

请尝试以下代码:

    static Uri capturedImageUri=null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
     this.imageView = (ImageView)this.findViewById(R.id.imageView1);
Button photoButton = (Button) this.findViewById(R.id.button1);
     photoButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
    Calendar cal = Calendar.getInstance();
    File file = new File(Environment.getExternalStorageDirectory(),  (cal.getTimeInMillis()+".jpg"));
    if(!file.exists()){
    try {
    file.createNewFile();
    } catch (IOException e) {
    // TODO Auto-generated catch block
       e.printStackTrace();
     }
       }else{
     file.delete();
     try {
   file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
    e.printStackTrace();
}
}
capturedImageUri = Uri.fromFile(file);
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(MediaStore.EXTRA_OUTPUT, capturedImageUri);
startActivityForResult(i, CAMERA_RESULT);
   }
});

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
      if (requestCode == CAMERA_REQUEST) {  
    //Bitmap photo = (Bitmap) data.getExtras().get("data");
    //imageView.setImageBitmap(photo);
    try {
    Bitmap bitmap = MediaStore.Images.Media.getBitmap( getApplicationContext().getContentResolver(),  capturedImageUri);
     imageView.setImageBitmap(bitmap);
    } catch (FileNotFoundException e) {
      // TODO Auto-generated catch block
     e.printStackTrace();
      } catch (IOException e) {
    // TODO Auto-generated catch block
     e.printStackTrace();
        }
     }  
   }

还要不要忘记在Android Manifest文件中添加一些权限,例如:

 `note: add permission WRITE_EXTERNAL_STORAGE in manifest file.`

谢谢您的评论。我已经尝试了您的代码,但有时仍然无法正常工作。您认为问题出在哪里? - Jason

0

在调用 setImageUri 之前,你应该检查文件是否存在。当应用程序更改方向时,mOutUri 内容可能会丢失,当你打开相机时有时会发生这种情况。你应该在 activity 的 onSaveInstanceState 中实现,将 uri 存储到偏好设置中,并在 onRestoreInstanceState 中恢复你的 uri。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接