Come catturare un'immagine e memorizzarla con la fotocamera nativo Android
-
27-09-2019 - |
Domanda
Sto avendo un problema di acquisire un'immagine e la memorizzazione dal app fotocamera nativa. Ecco un esempio di alcuni dei miei codice.
_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 );
Dopo che la foto è stata scattata e sto tornato di nuovo alla mia attività originaria, quando navigo alla mia scheda SD tramite File DDMS Android Explorer l'immagine non c'è. Qualcuno sa perché questo non viene salvato?
Soluzione
Hai controllato ciò che l'output di Environment.getExternalStorageDirectory () è, perché se non contiene un file di trascinamento separatore (/) allora la vostra immagine sarà finire in una directory che non risiede sulla scheda SD come ad esempio:
/mnt/sdcardmake_machine_example.jpg
Quando ciò che si vuole veramente è:
/mnt/sdcard/make_machine_example.jpg
Prova questo codice invece:
_path = Environment.getExternalStorageDirectory() + File.separator + "make_machine_example.jpg";
Altri suggerimenti
Qui era il prodotto finale nel caso qualcuno è ancora visitare questa discussione:
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. Proprio l'uso
new File(Environment.getExternalStorageDirectory(), "make_machine_example.jpg");
e non preoccuparsi di separatori.
2. Di fronte lo stesso problema prima. telefoni SenseUI hanno un'applicazione della fotocamera personalizzato che non crea file. Che dispositivo stai usando? Si potrebbe già essere fissato in tutti i dispositivi, ma può anche essere ancora un problema. Quindi, ecco un campione completo come superarla salvataggio di una foto a un file .
Si dovrebbe eseguire una scansione media dopo il salvataggio dell'immagine
sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
Aggiungi questa linea nel AndroidManifest.xml file e l'estensione rimuovere make_machine_example:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Si inizierà a scattare la foto e memorizzare nella scheda SD.