Android Bilder aus der Galerie auswählen


196

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 in dieser Aktivität Videodateien angezeigt werden. Gibt es eine Möglichkeit, angezeigte Dateien so zu filtern, dass in dieser Aktivität keine Videodateien angezeigt werden?


3
Dieser Artikel beschreibt gut, wie man Bilder aus der Galerie auswählt
Andy Res

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

Antworten:


343

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 PICK_IMAGE zu erstellen , damit Sie erkennen können, wann der Benutzer aus der Bildergalerie zurückkommt. Aktivität:

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. So kann der Benutzer auch alle von ihm installierten Galerie-Apps verwenden:

    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);

6
Ich bekomme 2 Optionen auf diesem "Android-System", "Dokumente". Wenn ich Android System auswähle, werden mir Galerie und Fotos angezeigt. Wie entferne ich diese Zwischenoptionsliste?
Uday

4
@Uday liegt es einfach daran, dass Sie die Standardeinstellung nicht festgelegt haben. Lass es einfach :)
Tristan Wiley

13
Auf was muss die Konstante PICK_IMAGE gesetzt werden? Es heißt "Symbol kann nicht aufgelöst werden" PICK_IMAGE "
Michael

3
@Michael Die PICK_IMAGE- Konstante enthält alle statischen int- Werte, die Sie für diese Klasse festgelegt haben. Dies wird auch für die @OverrideFunktion verwendet onActivityResult(int requestCode, resultCode, Intent data). Es wird empfohlen, diese Konstante zu verwenden, um den requestCodeParameter zu überprüfen , bevor Sie eine Aktion
ausführen

Sie können die Bitmap aus der onActivityResult (...) -Methode mit dem folgenden Code abrufen (unter der Annahme von RESULT_OK): Bitmap bitmap = data.getExtras (). GetParcelable ("data");
Shn_Android_Dev

196

Manchmal können Sie aus dem ausgewählten Bild keine Datei abrufen. Dies 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 Intent.ACTION_GET_CONTENT auszuwählen und das Ergebnis bei einem Inhaltsanbieter zu erhalten.

Sie können dem folgenden Code folgen oder sich meine aktualisierte Übersicht ansehen .

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...
    }
}

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

Wie können Sie Weg bekommen?
liefern

@ Delive, ich denke, Sie könnten versuchen new File(data.getData()).getAbsolutePath()Nur eine Vermutung, ich habe es nicht versucht
Jemand irgendwo

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

1
Dies funktioniert auf bestimmten Geräten, auf denen der Pfad der Datei nicht zurückgegeben wird. Ich sehe jedoch keine Möglichkeit, - sobald ich den InputStream habe - zu bestimmen, wie die Ausrichtung des Bildes ermittelt werden soll.
Casey Perkins

30
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);


}

Vielen Dank. Diese Antwort half mir, das Bild später hochzuladen
Rosário Pereira Fernandes

Ich denke du meinst Fall 1: anstelle von Fall -1: im Schalter im OnActivityResult.
Mathias

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

Was ist der Wert von path? inFile file = new File(path);
Ravi Vaniya

23

Mit dieser Methode können Sie Bilder aus der Galerie auswä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 überschreiben Sie onActivityResult 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");
            }
        }
    }

2
@Abhishek ... wo hast du die Liste der Extras gefunden, die für die Absicht ACTION_PICK erlaubt sind? Vielen Dank!
Johnny Wu

1
Bitte vergessen Sie nicht, Laufzeitberechtigungen für READ_EXTERNAL_STORAGE und WRITE_EXTERNAL_STORAGE für API-Level 23 und höher hinzuzufügen. Andernfalls erhalten Sie möglicherweise keine Bitmap aus der Galerie als nicht null. Siehe stackoverflow.com/a/35285667/3341089
oguzhan

1
Durch Aufrufen von setType nach dem Festlegen des URI werden die Daten gelöscht.
Taslim Oseni

11

Hier ist ein vollständiges Beispiel für die Anforderung einer Berechtigung (falls erforderlich): Wählen Sie ein Bild aus der Galerie aus und konvertieren Sie das Bild in bitmapoderfile

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

1
Zurück hier ist es nicht so gut, wie ich gehofft habe, die ersten Eindrücke zu sehen. 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. Bringen Sie es zurück ohne es direkt. Es funktioniert nur dann gut, wenn ich die Standardgalerie von huawei und Google Fotos zum Bearbeiten auswähle.
Lalit Fauzdar


1

Nur um ein Update der Antwort für Personen mit API min 19 gemäß den Dokumenten anzubieten:

Unter Android 4.4 (API-Stufe 19) und höher haben Sie zusätzlich die Möglichkeit, die Absicht ACTION_OPEN_DOCUMENT zu verwenden, mit der eine systemgesteuerte Auswahl-Benutzeroberfläche angezeigt wird, mit der der Benutzer alle Dateien durchsuchen kann, die andere Apps zur Verfügung gestellt haben. Über diese einzelne Benutzeroberfläche kann der Benutzer eine Datei aus einer der unterstützten Apps auswählen.

Unter Android 5.0 (API-Stufe 21) und höher können Sie auch die Absicht ACTION_OPEN_DOCUMENT_TREE verwenden, mit der der Benutzer ein Verzeichnis auswählen kann, auf das eine Client-App zugreifen soll.

Öffnen Sie Dateien mit dem Storage Access Framework - Android Docs

     val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
     intent.type = "image/*"
     startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE)

0

Für nur lokale Auswahl hinzufügen:

        i.putExtra(Intent.EXTRA_LOCAL_ONLY,true)

Und das funktioniert gut:

    val i = Intent(Intent.ACTION_GET_CONTENT,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
    i.type = "image/*"
    i.putExtra(Intent.EXTRA_LOCAL_ONLY,true)
    startActivityForResult(Intent.createChooser(i,"Select Photo"),pickImageRequestCode)

-7

Sie können es einfacher machen als diese Antworten:

Uri Selected_Image_Uri = data.getData();
ImageView imageView = (ImageView) findViewById(R.id.loadedimg);
imageView.setImageURI(Selected_Image_Uri);

Ich mache es und es hat funktioniert. Wenn Sie Dateien zum Beispiel zum Senden an den Server verwenden müssen, müssen Sie andere Methoden verwenden, aber nur um ein Bild in die Bildansicht zu laden, können Sie diese einfache Lösung ausführen.
Alireza Taghizadeh

5
Willkommen bei SO! Anstatt Ihren eigenen Beitrag zu kommentieren, können Sie Ihren Beitrag auch bearbeiten. Wenn Ihr Kommentar die Antwort erklären soll, warum nicht in die Antwort selbst einfügen? Persönlich sehe ich nicht, wie Ihre (späte) Antwort auf diese alte Frage mit der Frage zusammenhängt. Darf ich vorschlagen, sich zuerst auf die Beantwortung von Fragen zu konzentrieren, die noch keine akzeptierte Antwort haben?
cfi

1
Ich kann keine Android-Fragen finden. Wie kann ich nur Android-Fragen sehen?
Alireza Taghizadeh

3
Bitte lesen Sie die Hilfeseiten. Außerdem sind Kommentare nicht für Diskussionen über die Funktionsweise der Website gedacht. Sie können Chatrooms für Live-Diskussionen mit anderen Benutzern verwenden und spezifische Fragen zu Meta (Hilfe-> Meta) stellen
siehe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.