Ich versuche meinem Benutzer zu ermöglichen, ein Bild aus der Telefongalerie auszuwählen oder ein Foto mit der Kamera aufzunehmen. schrieb ich ein Stück Code wirklich gut auf meinem Samsung S6 arbeitetWie vermeidet man die Verwendung von MediaStore.EXTRA_OUTPUT in der Kameraabsicht?
private void openPictureIntent() {
final List<Intent> cameraIntents = new ArrayList<>();
final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
final PackageManager packageManager = getPackageManager();
final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
for (ResolveInfo res : listCam) {
final String packageName = res.activityInfo.packageName;
final Intent intent = new Intent(captureIntent);
intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
intent.setPackage(packageName);
cameraIntents.add(intent);
}
// Filesystem.
final Intent galleryIntent = new Intent();
galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
// Chooser of filesystem options.
final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");
// Add the camera options.
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()]));
startActivityForResult(chooserIntent, SELECT_PICTURE_CODE);
}
Dann versuchte ich es auf einem Nexus 5X und meine App abgestürzt. Ich habe gelernt, dass die in onActivityResult abgerufene Absicht bei einigen Geräten null ist. Die Lösung besteht darin, der uri zu geben, wo das mit der Kamera aufgenommene Bild gespeichert werden soll. Ich implementierte es und mein Code wurde
private void openPictureIntent() {
// Determine Uri of camera image to save.
final File dir = new File(Environment.getExternalStorageDirectory() + File.separator + "Directory" + File.separator);
dir.mkdirs();
final String fname = UUID.randomUUID() + ".jpg";
final File sdImageMainDirectory = new File(dir, fname);
outputFileUri = Uri.fromFile(sdImageMainDirectory);
new File(outputFileUri.getPath()).delete();
// Camera.
final List<Intent> cameraIntents = new ArrayList<>();
final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
final PackageManager packageManager = getPackageManager();
final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
for (ResolveInfo res : listCam) {
final String packageName = res.activityInfo.packageName;
final Intent intent = new Intent(captureIntent);
intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
intent.setPackage(packageName);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
cameraIntents.add(intent);
}
// Filesystem.
final Intent galleryIntent = new Intent();
galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
// Chooser of filesystem options.
final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");
// Add the camera options.
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()]));
startActivityForResult(chooserIntent, SELECT_PICTURE_CODE);
}
Dies funktioniert, aber ich bin nicht zufrieden. Ich möchte, dass mein Foto mit einem anderen Kamerafoto und nicht in einem speziellen Verzeichnis gespeichert wird. Wie könnte ich das erreichen?
Bild speichern Environment.DIRECTORY_PICTURES Verzeichnis –
Die Galerie Intent zeigen nicht die Fotos aus dem Bildverzeichnis (dasselbe gilt für das DCIM-Repository) auf meinem Gerät und ich möchte auf allen Geräten das gleiche Ergebnis haben – Tibo
Images in 'gespeichert Environment.DIRECTORY_PICTURES' und 'Environment.DIRECTORY_DCIM' sind perfekt geeignet, vom' MediaStore' gescannt zu werden und erscheinen daher in galerieartigen Apps. Sie werden automatisch indiziert, und Entwickler können 'MediaScannerConnection' verwenden, um bestimmte Dateien zum' MediaStore' hinzuzufügen, wenn sie erstellt werden. – CommonsWare