2012-10-12 43 views
5

可能重複:
Using Camera and storing captured result in SDCard in android的意圖打開一個相機應用並保存在SD圖像和ImageView的

我想從相機應用的圖片,將它保存在SD和集ImageView的。 我在下面做了一個代碼。保存和imageView有時工作。但有時圖片保存在SD和imageView不起作用。

當imageView不起作用時,似乎mOutUri在onActivityResult中變爲null。

我試圖在clkbutton的SharedPreferences上保存一個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);  
} 

這太奇怪了,它有時會出錯,有時還會起作用。

回答

0

在setImageUri之前的onActivityResult中,您應該檢查文件是否存在。當應用程序更改方向時,您可能會丟失mOutUri內容,並且在打開相機時它會發生。你應該在activity的onSaveInstanceState中存儲你的uri和onRestoreInstanceState,並在其中存儲你的uri。

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 manifets文件,如:

`note: add permission WRITE_EXTERNAL_STORAGE in manifest file.` 
+0

謝謝你的評論。我已經嘗試過你的代碼,但它仍然有時不起作用。你認爲問題是什麼? – Jason

相關問題