33

Ich habe ein Problem, ein Bild zu erfassen und es von der nativen Kamera-App zu speichern. Hier ist ein Beispiel für einen Teil meines Codes.So erfassen Sie ein Bild und speichern es mit der nativen Android-Kamera

_path = Environment.getExternalStorageDirectory() + "make_machine_example.jpg"; 
File file = new File(_path); 
Uri outputFileUri = Uri.fromFile(file); 

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

startActivityForResult(intent, 0); 

Nachdem das Bild aufgenommen wurde, und ich bin zurück zu meiner ursprünglichen Aktivität zurückgeführt, wenn ich auf meine SD-Karte über Android DDMS Datei Explorer navigieren das Bild nicht da ist. Wer weiß, warum das nicht gerettet wird?

+0

Hallo an alle, ich will Bild von der Native-Kamera von Android erfassen und speichern es ..so dass ich Bounty gemacht habe becoz damit beunruhigend –

+0

Paresh Was sind Ihre Probleme bei der Aufnahme des Bildes? Funktioniert der in dieser Frage gezeigte Ansatz nicht für Sie? – Janusz

+0

@ Janusz Ich muss ein Textview (Activity Name), eine Schaltfläche (unten) und in der Mitte des Bildschirms, Kamera Vorschau ist da und auf Schaltfläche klicken Ereignis, Foto sollte angeklickt werden und Foto sollte in Bildansicht eines anderen angezeigt werden Aktivität –

Antwort

20

Haben Sie überprüft, was die Ausgabe von Environment.getExternalStorageDirectory() ist, denn wenn es keine Dateitrennzeichen (/) enthält, wird Ihr Bild in einem Verzeichnis landen, das nicht auf der SD-Karte liegt:

/mnt/sdcardmake_machine_example.jpg 

Wenn Sie wirklich, was Sie wollen ist:

/mnt/sdcard/make_machine_example.jpg 

diesen Code Versuchen Sie stattdessen:

_path = Environment.getExternalStorageDirectory() + File.separator + "make_machine_example.jpg"; 
+2

Ja, ich kann bestätigen, dass Sie das Dateitrennzeichen hinzufügen müssen –

14

1. Verwenden Sie einfach

new File(Environment.getExternalStorageDirectory(), "make_machine_example.jpg"); 

und kümmern sich nicht um Separatoren.

2. Konfrontiert mit dem gleichen Problem zuvor. SenseUI-Telefone verfügen über eine benutzerdefinierte Kameraanwendung, die keine Datei erstellt. Welches Gerät verwendest du? Es ist möglicherweise bereits in den neuesten Geräten behoben, aber es kann auch noch ein Problem sein. Also hier ist ein komplettes Beispiel, wie man es überwinden kann Problems saving a photo to a file.

25

Hier das Endprodukt falls jemand zu Besuch war noch dieses Thema anschauen:

public class CameraCapture extends Activity { 

    protected boolean _taken = true; 
    File sdImageMainDirectory; 

    protected static final String PHOTO_TAKEN = "photo_taken"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     try { 

      super.onCreate(savedInstanceState);   
        File root = new File(Environment 
          .getExternalStorageDirectory() 
          + File.separator + "myDir" + File.separator); 
        root.mkdirs(); 
        sdImageMainDirectory = new File(root, "myPicName"); 


       startCameraActivity(); 
      } 
     } catch (Exception e) { 
      finish(); 
      Toast.makeText(this, "Error occured. Please try again later.", 
        Toast.LENGTH_SHORT).show(); 
     } 

    } 

    protected void startCameraActivity() { 

     Uri outputFileUri = Uri.fromFile(sdImageMainDirectory); 

     Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

     startActivityForResult(intent, 0); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (resultCode) { 
     case 0: 
      finish(); 
      break; 

     case -1: 

      try { 
       StoreImage(this, Uri.parse(data.toURI()), 
         sdImageMainDirectory); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      finish(); 
      startActivity(new Intent(CameraCapture.this, Home.class)); 

     } 

    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) { 
      _taken = true; 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken); 
    } 

     public static void StoreImage(Context mContext, Uri imageLoc, File imageDir) { 
     Bitmap bm = null; 
     try { 
      bm = Media.getBitmap(mContext.getContentResolver(), imageLoc); 
      FileOutputStream out = new FileOutputStream(imageDir); 
      bm.compress(Bitmap.CompressFormat.JPEG, 100, out); 
      bm.recycle(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 
+1

Müssen Sie zusätzliche Berechtigungen im Manifest festlegen? Ich kann der zu sd – Vincent

+0

gespeicherten Bilddatei meinen eigenen Namen nicht geben ja ... \t ninjasense

+0

Hallo Ninja !! Darf ich wissen, was ist "Home.class" ???? Sein Sprichwort, um eine Klasse/Enum usw. zu erstellen. Ich bin neu in Android-Programmierung. – iankits

-5

diese Zeile in AndroidManifest.xml Datei hinzufügen und Erweiterung make_machine_example entfernen:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Es beginnt um das Foto aufzunehmen und auf der SD-Karte zu speichern.

+0

wird es nicht gespeichertes Bild speichern. –

1

Sie sollten ein Medien Scannen nach dem Speichern des Bildes durchführen

sendBroadcast(new Intent(
      Intent.ACTION_MEDIA_MOUNTED, 
      Uri.parse("file://" + Environment.getExternalStorageDirectory())));