Android 通过intent打开相机应用程序,并将图片保存在SD和imageView上
可能重复:Android 通过intent打开相机应用程序,并将图片保存在SD和imageView上,android,android-intent,camera,imageview,sd-card,Android,Android Intent,Camera,Imageview,Sd Card,可能重复: 我想从相机应用程序中获取图片,将其保存在SD上并设置imageView。 我在下面编了一个代码。保存和查看图像有时会起作用。但有时图片保存在SD上,imageView不起作用 当imageView不工作时,mOutUri在onActivityResult中似乎变为null 我试图在clkbutton中的SharedReferences上保存一个mOutUri。我可以在onActivityResult中看到uri,但imageView不起作用。此时,mOutUri也为空 public
我想从相机应用程序中获取图片,将其保存在SD上并设置imageView。 我在下面编了一个代码。保存和查看图像有时会起作用。但有时图片保存在SD上,imageView不起作用 当imageView不工作时,mOutUri在onActivityResult中似乎变为null 我试图在clkbutton中的SharedReferences上保存一个mOutUri。我可以在onActivityResult中看到uri,但imageView不起作用。此时,mOutUri也为空
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);
}
它非常奇怪,有时会出错,有时也会工作。在onActivityResult中,在设置ImageURI之前,应该检查文件是否存在。当应用程序改变方向时,你们可能会丢失mOutUri的内容,当你们打开相机的时候,这种情况就会发生。您应该在活动onSaveInstanceState中实现,您可以在其中存储uri,并在onRestoreInstanceState中恢复uri。请尝试以下代码:
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 manifets文件中添加一些权限,如:
`note: add permission WRITE_EXTERNAL_STORAGE in manifest file.`
谢谢你的评论。我试过你的代码,但有时还是不起作用。你认为问题是什么??