2017-04-12 6 views
0

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?

+0

Bild speichern Environment.DIRECTORY_PICTURES Verzeichnis –

+0

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

+0

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

Antwort

1

Ich habe gelernt, dass die in onActivityResult abgerufene Absicht bei einigen Geräten null ist.

Es soll null für alle Kamera-Apps sein. Einige Entwickler von Kamera-Apps können the documentation for ACTION_IMAGE_CAPTURE nicht lesen.

Ich würde mein Foto gerne mit anderer Kamera Foto gespeichert und nicht in einem speziellen Verzeichnis

, die nicht von ACTION_IMAGE_CAPTURE unterstützt wird.

+0

Wenn ich Ihre Antwort gut verstehe, gibt es zum Schluss keine Lösung, wenn ich ACTION_IMAGE_CAPTURE verwenden möchte? – Tibo

+0

@Tibo: Es gibt Tausende von Kamera-Apps, von denen viele 'ACTION_IMAGE_CAPTURE' unterstützen. Sie haben keine Möglichkeit zu wissen, wo "mit anderen Kamera Foto" für Tausende von Kamera-Apps sein wird. Sie können Ihre Fotos an einem wahrscheinlichen Ort speichern (z. B. "Environment.DIRECTORY_DCIM"), aber das ist es. – CommonsWare

+0

Vielen Dank für Ihre Antwort! – Tibo

Verwandte Themen