Wie ein Bild zu erfassen und speichern Sie es mit der nativen Android-Kamera
-
27-09-2019 - |
Frage
ich habe ein Problem, ein Bild zu erfassen und es von dem nativen Kamera-App zu speichern. Hier ist ein Beispiel von einigen meiner Code.
_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 ist das Bild nicht da. Wer weiß, warum diese nicht gespeichert werden?
Lösung
Haben Sie überprüft, wie die Ausgabe von Environment.getExternalStorageDirectory () ist, denn wenn es keine abschließende Datei seperator enthält (/), dann Ihr Bild in einem Verzeichnis am Ende wird, die auf der SD-Karte befindet sich solche nicht so:
/mnt/sdcardmake_machine_example.jpg
Wenn, was Sie wirklich wollen, ist:
/mnt/sdcard/make_machine_example.jpg
Versuchen Sie stattdessen diesen Code:
_path = Environment.getExternalStorageDirectory() + File.separator + "make_machine_example.jpg";
Andere Tipps
Hier war das Endprodukt falls jemand besucht 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. Verwenden Sie einfach
new File(Environment.getExternalStorageDirectory(), "make_machine_example.jpg");
und nicht die Mühe über Separatoren.
2. Konfrontiert vor dem gleichen Problem. SenseUI Telefone haben eine Anwendung benutzerdefinierte Kamera, die nicht-Datei erstellen ist. Was Gerät verwenden Sie? Es kann bereits in neuesten Geräten festgelegt werden, aber es kann auch noch ein Thema sein. Also hier ist ein vollständiges Beispiel, wie es zu überwinden Probleme ein Foto gespeichert zu eine Datei .
Sie sollten ein Medien-Scanning durchführen, nachdem das Bild zu speichern
sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
Fügen Sie diese Zeile in AndroidManifest.xml Datei und entfernen Erweiterung make_machine_example:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Es beginnt das Foto und Laden in die SD-Karte zu erfassen.