Android Bilder aus der Galerie auswählen

Lesezeit: 11 Minuten

Android Bilder aus der Galerie auswahlen
Buda Gawril

Ich möchte eine Bildauswahl aus der Galerie erstellen. Ich benutze Code

 intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
 startActivityForResult(intent, TFRequestCodes.GALLERY);

Mein Problem ist, dass bei dieser Aktivität auch Videodateien angezeigt werden. Gibt es eine Möglichkeit, angezeigte Dateien zu filtern, sodass bei dieser Aktivität keine Videodateien angezeigt werden?

  • Dieser Artikel beschreibt schön, wie man Bilder aus der Galerie auswählt: androidbitmaps.blogspot.com/2015/04/…

    – Andy Res

    17. April 2015 um 5:13 Uhr

  • Es gibt eine ähnliche Frage wie Sie. stackoverflow.com/a/31382240/1835650

    – Teetracker

    13. Juli 2015 um 11:39 Uhr

Android Bilder aus der Galerie auswahlen
JMRboosties

Absolut. Versuche dies:

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);

Vergessen Sie nicht, auch die Konstante zu erstellen PICK_IMAGEdamit Sie erkennen können, wann der Benutzer von der Bildergalerie-Aktivität zurückkommt:

public static final int PICK_IMAGE = 1;

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (requestCode == PICK_IMAGE) {
        //TODO: action
    }
}

So nenne ich die Bildergalerie. Setzen Sie es ein und sehen Sie, ob es für Sie funktioniert.

BEARBEITEN:

Dadurch wird die Dokumente-App aufgerufen. Um dem Benutzer zu erlauben, auch alle Galerie-Apps zu verwenden, die er möglicherweise installiert hat:

    Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
    getIntent.setType("image/*");

    Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    pickIntent.setType("image/*");

    Intent chooserIntent = Intent.createChooser(getIntent, "Select Image");
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent});

    startActivityForResult(chooserIntent, PICK_IMAGE);

  • Ich bekomme 2 Optionen auf diesem “Android-System”, “Dokumente”. Wenn ich Android-System auswähle, werden mir Galerie und Fotos angezeigt. Wie werde ich diese Zwischenoptionsliste los?

    – Udayaditya Barua

    11. Dezember 2015 um 7:54 Uhr


  • @Uday es liegt einfach daran, dass Sie die Standardeinstellung nicht festgelegt haben. Lass es einfach 🙂

    – Tristan Wiley

    8. Januar 2016 um 22:31 Uhr

  • Auf was muss die Konstante PICK_IMAGE gesetzt werden? Es heißt “Symbol “PICK_IMAGE” kann nicht aufgelöst werden.”

    – Michael

    20. August 2016 um 18:15 Uhr

  • @Michael der PICK_IMAGE konstant hält jede statisch int Wert, den Sie auf genau dieser Klasse festgelegt haben, dieser wird auf der weiterverwendet @Override Funktion onActivityResult(int requestCode, resultCode, Intent data)wobei empfohlen wird, diese Konstante zu verwenden, um die requestCode Parameter, bevor Sie eine Aktion ausführen 🙂

    – Gabcvit

    14. September 2017 um 14:06 Uhr


  • Sie können die Bitmap aus der Methode onActivityResult(…) mit dem folgenden Code abrufen (Ergebnis_OK vorausgesetzt): Bitmap bitmap = data.getExtras().getParcelable(“data”);

    – Shn_Android_Dev

    1. März 2018 um 21:58 Uhr


Android Bilder aus der Galerie auswahlen
Benjamin

Manchmal können Sie keine Datei von dem Bild erhalten, das Sie auswählen. Das liegt daran, dass der Ausgewählte von Google+, Drive, Dropbox oder einem anderen Anbieter stammt.

Die beste Lösung besteht darin, das System zu bitten, einen Inhalt über auszuwählen Absicht.ACTION_GET_CONTENT und erhalten Sie das Ergebnis mit einem Inhaltsanbieter.

Sie können dem folgenden Code folgen oder sich meine ansehen aktualisierter Kern.

public void pickImage() {
  Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  intent.setType("image/*");
  startActivityForResult(intent, PICK_PHOTO_FOR_AVATAR);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_PHOTO_FOR_AVATAR && resultCode == Activity.RESULT_OK) {
        if (data == null) {
            //Display an error
            return;
        }
        InputStream inputStream = context.getContentResolver().openInputStream(data.getData());
        //Now you can do whatever you want with your inpustream, save it as file, upload to a server, decode a bitmap...
    }
}

  • if(resultCode == Activity.RESULT_OK) {...} kann verwendet werden, um Erfolg zu erkennen/abzubrechen

    – Thamme Gowda

    4. Februar 2014 um 13:57 Uhr

  • Wie bekommt man den Pfad?

    Benutzer3402040

    9. Oktober 2015 um 10:27 Uhr

  • @delive, ich denke, du könntest es versuchen new File(data.getData()).getAbsolutePath() Nur eine Vermutung, ich habe es nicht probiert

    – Irgendwer irgendwo

    17. Dezember 2015 um 15:14 Uhr

  • FileNotFound-Ausnahmewarnung von Android Studio im Fragment in getActivity().getContentResolver().openInputStream(data.getData());.

    – Iqbal

    27. Januar 2016 um 11:02 Uhr


  • Dies funktioniert auf bestimmten Geräten, bei denen der Pfad der Datei nicht zurückgegeben wird. Ich sehe jedoch keine Möglichkeit zu bestimmen – sobald ich den InputStream habe – wie ich die Ausrichtung des Bildes herausfinden kann.

    – Casey Perkins

    9. Februar 2017 um 19:08 Uhr

public void FromCamera() {

    Log.i("camera", "startCameraActivity()");
    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, 1);

}

public void FromCard() {
    Intent i = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(i, 2);
}

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 2 && resultCode == RESULT_OK
            && null != data) {

        Uri selectedImage = data.getData();
        String[] filePathColumn = { MediaStore.Images.Media.DATA };

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();

        bitmap = BitmapFactory.decodeFile(picturePath);
        image.setImageBitmap(bitmap);

        if (bitmap != null) {
            ImageView rotate = (ImageView) findViewById(R.id.rotate);

        }

    } else {

        Log.i("SonaSys", "resultCode: " + resultCode);
        switch (resultCode) {
        case 0:
            Log.i("SonaSys", "User cancelled");
            break;
        case -1:
            onPhotoTaken();
            break;

        }

    }

}

protected void onPhotoTaken() {
    // Log message
    Log.i("SonaSys", "onPhotoTaken");
    taken = true;
    imgCapFlag = true;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 4;
    bitmap = BitmapFactory.decodeFile(path, options);
    image.setImageBitmap(bitmap);


}

  • Danke sehr. Diese Antwort hat mir geholfen, das Bild später hochzuladen

    – Rosário Pereira Fernandes

    21. August 2017 um 1:25 Uhr

  • Ich vermute, Sie meinen Fall 1: statt Fall -1: im Schalter im OnActivityResult.

    – Matthias

    26. November 2017 um 9:21 Uhr

  • Ich weiß, es ist eine Newibe-Frage, aber warum haben wir das alles getan, um den Bildpfad zu erhalten, was gibt data.getData dann zurück?

    – moumenShobakey

    5. Februar 2020 um 9:12 Uhr

  • was ist der Wert von path? in File file = new File(path);

    – Ravi Wanija

    3. März 2020 um 10:05 Uhr


Sie können diese Methode verwenden, um ein Bild aus der Galerie auszuwählen. Es werden nur Bilder angezeigt.

public void pickImage() {
    Intent intent = new Intent(Intent.ACTION_PICK,
            MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    intent.setType("image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("scale", true);
    intent.putExtra("outputX", 256);
    intent.putExtra("outputY", 256);
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, 1);
}

und onActivityResult überschreiben als

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == 1) {
            final Bundle extras = data.getExtras();
            if (extras != null) {
                //Get image
                Bitmap newProfilePic = extras.getParcelable("data");
            }
        }
    }

1646429591 156 Android Bilder aus der Galerie auswahlen
Linh

Hier ist ein vollständiges Beispiel für die Anforderung einer Erlaubnis (falls erforderlich), das Bild aus der Galerie auswählen und dann das Bild konvertieren in bitmap oder file

AndroidManifesh.xml

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

Aktivität

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button_pick_image.setOnClickListener {
            pickImage()
        }
    }

    private fun pickImage() {
        if (ActivityCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            val intent = Intent(
                Intent.ACTION_PICK,
                MediaStore.Images.Media.INTERNAL_CONTENT_URI
            )
            intent.type = "image/*"
            intent.putExtra("crop", "true")
            intent.putExtra("scale", true)
            intent.putExtra("aspectX", 16)
            intent.putExtra("aspectY", 9)
            startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE)
        } else {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
                READ_EXTERNAL_STORAGE_REQUEST_CODE
            )
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == PICK_IMAGE_REQUEST_CODE) {
            if (resultCode != Activity.RESULT_OK) {
                return
            }
            val uri = data?.data
            if (uri != null) {
                val imageFile = uriToImageFile(uri)
                // todo do something with file
            }
            if (uri != null) {
                val imageBitmap = uriToBitmap(uri)
                // todo do something with bitmap
            }
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            READ_EXTERNAL_STORAGE_REQUEST_CODE -> {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // pick image after request permission success
                    pickImage()
                }
            }
        }
    }

    private fun uriToImageFile(uri: Uri): File? {
        val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
        val cursor = contentResolver.query(uri, filePathColumn, null, null, null)
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                val columnIndex = cursor.getColumnIndex(filePathColumn[0])
                val filePath = cursor.getString(columnIndex)
                cursor.close()
                return File(filePath)
            }
            cursor.close()
        }
        return null
    }

    private fun uriToBitmap(uri: Uri): Bitmap {
        return MediaStore.Images.Media.getBitmap(this.contentResolver, uri)
    }

    companion object {
        const val PICK_IMAGE_REQUEST_CODE = 1000
        const val READ_EXTERNAL_STORAGE_REQUEST_CODE = 1001
    }
}

Demo
https://github.com/PhanVanLinh/AndroidPickImage

  • Dies ist nichts weniger als eine Bibliothek, insbesondere mit dieser Funktion zum Zuschneiden und Seitenverhältnis. Ich wusste nie, dass so etwas existiert. Vielen Dank, mein Herr.

    – Lalit Fauzdar

    9. Mai 2020 um 14:43 Uhr


  • Hier hinten ist es nicht so gut, wie ich nach den ersten Eindrücken gehofft hatte. Es wählt das Bild nicht aus, wenn es mit Snapseed bearbeitet wird, kein Absturz, aber kein Bild, die Standard-Galerie-App von Huawei macht nichts, wenn ich nach der Bearbeitung auf Weiter klicke, es bearbeitet kein Bild, wenn es aus Google-Fotos ausgewählt wird, bring es zurück ohne es direkt. Es funktioniert nur gut, wenn ich die Standardgalerie von Huawei und Google Fotos wähle, um sie zu bearbeiten.

    – Lalit Fauzdar

    9. Mai 2020 um 16:14 Uhr

  • Danke. Sehr gute Antwort und funktioniert beim ersten Mal sehr gut.

    – sagar.android

    25. Mai 2021 um 13:05 Uhr

1646429592 267 Android Bilder aus der Galerie auswahlen
abolfazl bazghandi

Ich habe das gleiche Problem. Ich benutze diese Codes

addIntent

 Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Tack Image"), PICK_PHOTO);

addieren onActivityResult

 @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_PHOTO && resultCode == Activity.RESULT_OK) {
      if (data == null) {
      //error
        return;
      }
      try {
        Uri uri = data.getData();
        File file = FileUtil.from(currentActivity, uri);
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

FileUtil-Klasse

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.OpenableColumns;
import android.util.Log;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FileUtil {
  private static final int EOF = -1;
  private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;

  private FileUtil() {

  }

  public static File from(Context context, Uri uri) throws IOException {
    InputStream inputStream = context.getContentResolver().openInputStream(uri);
    String fileName = getFileName(context, uri);
    String[] splitName = splitFileName(fileName);
    File tempFile = File.createTempFile(splitName[0], splitName[1]);
    tempFile = rename(tempFile, fileName);
    tempFile.deleteOnExit();
    FileOutputStream out = null;
    try {
      out = new FileOutputStream(tempFile);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    if (inputStream != null) {
      copy(inputStream, out);
      inputStream.close();
    }

    if (out != null) {
      out.close();
    }
    return tempFile;
  }

  private static String[] splitFileName(String fileName) {
    String name = fileName;
    String extension = "";
    int i = fileName.lastIndexOf(".");
    if (i != -1) {
      name = fileName.substring(0, i);
      extension = fileName.substring(i);
    }

    return new String[]{name, extension};
  }

  private static String getFileName(Context context, Uri uri) {
    String result = null;
    if (uri.getScheme().equals("content")) {
      Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
      try {
        if (cursor != null && cursor.moveToFirst()) {
          result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
        }
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        if (cursor != null) {
          cursor.close();
        }
      }
    }
    if (result == null) {
      result = uri.getPath();
      int cut = result.lastIndexOf(File.separator);
      if (cut != -1) {
        result = result.substring(cut + 1);
      }
    }
    return result;
  }

  private static File rename(File file, String newName) {
    File newFile = new File(file.getParent(), newName);
    if (!newFile.equals(file)) {
      if (newFile.exists() && newFile.delete()) {
        Log.d("FileUtil", "Delete old " + newName + " file");
      }
      if (file.renameTo(newFile)) {
        Log.d("FileUtil", "Rename file to " + newName);
      }
    }
    return newFile;
  }

  private static long copy(InputStream input, OutputStream output) throws IOException {
    long count = 0;
    int n;
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
    while (EOF != (n = input.read(buffer))) {
      output.write(buffer, 0, n);
      count += n;
    }
    return count;
  }
}

und Sie müssen hinzufügen provider_paths.xml in den XML-Ordner wie das Bild
Geben Sie hier die Bildbeschreibung ein

provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="external_files" path="."/>
</paths>

und schließlich unten hinzufügen AndroidManifest.xml

<application
...>

...
      <provider
          android:name="androidx.core.content.FileProvider"
          android:authorities="${applicationId}.provider"
          android:exported="false"
          android:grantUriPermissions="true">
          <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
        </provider>
...
</application>

Ich hoffe, ich konnte helfen

  • Dies ist nichts weniger als eine Bibliothek, insbesondere mit dieser Funktion zum Zuschneiden und Seitenverhältnis. Ich wusste nie, dass so etwas existiert. Vielen Dank, mein Herr.

    – Lalit Fauzdar

    9. Mai 2020 um 14:43 Uhr


  • Hier hinten ist es nicht so gut, wie ich nach den ersten Eindrücken gehofft hatte. Es wählt das Bild nicht aus, wenn es mit Snapseed bearbeitet wird, kein Absturz, aber kein Bild, die Standard-Galerie-App von Huawei macht nichts, wenn ich nach der Bearbeitung auf Weiter klicke, es bearbeitet kein Bild, wenn es aus Google-Fotos ausgewählt wird, bring es zurück ohne es direkt. Es funktioniert nur gut, wenn ich die Standardgalerie von Huawei und Google Fotos wähle, um sie zu bearbeiten.

    – Lalit Fauzdar

    9. Mai 2020 um 16:14 Uhr

  • Danke. Sehr gute Antwort und funktioniert beim ersten Mal sehr gut.

    – sagar.android

    25. Mai 2021 um 13:05 Uhr

1646429593 405 Android Bilder aus der Galerie auswahlen
franklot

2021 Kotlin-Lösung mit neuer Version von Fragment:

dependencies {
  implementation "androidx.fragment:fragment:1.3.3"
}
class YourFragment : Fragment() {

    private val fileChooserContract = registerForActivityResult(ActivityResultContracts.GetContent()) { imageUri ->
        if (imageUri != null) {
            // imageUri now contains URI to selected image
        }
    }

    // ...

    fun openFileChooser() {
        fileChooserContract.launch("image/*")
    }
}

  • Wie stelle ich den Auswahltitel ein?

    – Sergej Stasischin

    13. Juli 2021 um 9:04 Uhr

939010cookie-checkAndroid Bilder aus der Galerie auswählen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy