2012-10-12 3 views
5

Mögliche Duplizieren:
Using Camera and storing captured result in SDCard in androideinen Kamera-App von Vorsatz öffnen und Bild auf der SD-und Imageview speichert

I-Bild von Kamera-App erhalten mag, auf SD und Set speichern Bildansicht. Ich habe einen Code unten gemacht. Speichern und ImageView funktioniert manchmal. aber manchmal ist das Bild auf SD gespeichert und ImageView funktioniert nicht.

Wenn imageView nicht funktioniert, scheint es, dass mOutUri in onActivityResult null wird.

Ich habe versucht, ein MoutUri auf SharedPreferences in clkbutton zu speichern. Ich kann die URI in onActivityResult sehen, aber ImageView funktioniert nicht. Zu dieser Zeit ist mOutUri auch 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);  
} 

Es ist so seltsam, dass es manchmal Fehler und manchmal funktioniert.

Antwort

0

In onActivityResult bevor Sie setImageUri sollten Sie überprüfen, ob die Datei existiert. Sie können den mOutUri-Inhalt verlieren, wenn die App die Ausrichtung ändert, und irgendwann, wenn Sie die Kamera öffnen. Sie sollten in Aktivität onSaveInstanceState implementieren, wo Sie in den Einstellungen Ihre uri und onRestoreInstanceState speichern, wo Sie Ihre uri wiederherstellen.

0

versuchen, den folgenden Code:

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

und auch vergessen Sie nicht, einige Berechtigungen hinzuzufügen, in android manifets wie file:

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

Vielen Dank für Ihren Kommentar. Ich habe Ihren Code versucht, aber es funktioniert manchmal nicht. Was denkst du ist das Problem? – Jason