2012-10-12 16 views
5

Powiel możliwe:
Using Camera and storing captured result in SDCard in androidotworzyć aplikację aparatu przez intencji i zapisać obraz na karcie SD i ImageView

Chcę uzyskać obraz z aplikacji aparatu, zapisz go na SD i zestaw imageView. Zrobiłem kod poniżej. zapisywanie i imageView czasami działa. ale czasami zdjęcie jest zapisywane na SD, a imageView nie działa.

Gdy imageView nie działa, wygląda na to, że mOutUri ma wartość null w onActivityResult.

Próbowałem zapisać mOutUri na SharedPreferences w clkbutton. Widzę uri w trybie onActivityResult, ale imageView nie działa. w tym momencie wartość mOutUri jest również zerowa.

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

To takie dziwne, że czasami błędy, a czasem działa.

Odpowiedz

0

W onActivityResult przed ustawieniemImageUri należy sprawdzić, czy plik istnieje. Możesz stracić zawartość mOutUri, gdy aplikacja zmienia orientację, a zdarzyło się to pewnego razu po otwarciu aparatu. Powinieneś zaimplementować w działaniu naSaveInstanceState, gdzie przechowujesz w preferencjach swój uri i onRestoreInstanceState, gdzie przywracasz swoje URI.

0

spróbować następujący kod:

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

a także nie zapomnij dodać pewne uprawnienia w pliku android manifets jak:

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

Dziękuję za komentarz. Próbowałem twojego kodu, ale wciąż nie działa. Jak myślisz, co to jest problem? – Jason

Powiązane problemy