web-dev-qa-db-de.com

Wie kann ich 2018 Bilder aus der Galerie auf Android auswählen?

ich würde gerne die Meinung der Community zum Problem erfahren, wie man ein Bild auf Android aus gängigen Quellen in unserer App verwenden kann. Ich weiß, dass es seit 2010 Fragen zum Stapelüberlauf gibt, aber ich fand die Antworten ein bisschen zu viel Code für diese einfache Aufgabe.

Vielleicht kennt jemand eine schlanke Bibliothek, um Bilder aus der Galerie (oder anderen gängigen Quellen) abzurufen, damit der Code einfach und lesbar bleibt

vielleicht so etwas wie:

            Bitmap image;

            SomeCoolLib.
            .performImageSelect()
            .asBitmap()  
            .listener(new RequestListener<String, Bitmap>() {
                @Override
                public boolean onException(Exception e) {
                    e.printStackTrace();
                    return false;
                }

                @Override
                public boolean onCancel() {
                    return false;
                }
            }).into(image);

benutzer zu lassen:

 so we can see this

4
user8913773

Am besten verwenden Sie das Android Storage Access Framework ( https://developer.Android.com/guide/topics/providers/document-provider.html ).

Beispielsweise können Sie in Ihrer Aktivität nach Gerät und Dokumenttyp fragen (beachten Sie die Methode intent.setType , wenn Sie nach Dokumenttyp filtern möchten).

Mit diesem Code wird die Android-Dokumentauswahl geöffnet und der Benutzer kann ein Bild auswählen:

public class MainActivity extends AppCompatActivity {

    private static final int OPEN_DOCUMENT_CODE = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.floatingActionButton).setOnClickListener(view ->    {
            Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            intent.setType("image/*");
            startActivityForResult(intent, OPEN_DOCUMENT_CODE);
        });

    }
}

Implementieren Sie dann einfach onActivityResult in derselben Aktivität, um das ausgewählte Bild zu erhalten:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
    if (requestCode == OPEN_DOCUMENT_CODE && resultCode == RESULT_OK) {
        if (resultData != null) {
            // this is the image selected by the user
            Uri imageUri = resultData.getData();
        }
    }
}
1

1, wählen Sie ein Bild

Wenn du dies verwendest ( Old style ):

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

Oder dies ( Offizielle Empfehlung ):

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");

Dieser Code öffnet FileManager in Android 8, das ist schwierig zu bedienen.

Wenn Sie die Alben-App auf dem Gerät des Benutzers öffnen und ein Foto auswählen möchten, sollten Sie Folgendes verwenden ( Ich empfehle ):

Intent intent = new Intent(Intent.ACTION_PICK,
                Android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

Bis dahin wird Uri in onActivityResult(int, int, Intent) angezeigt.

2, den Uri behandeln

Manchmal brauchen wir den realen Pfad des Bildes, und Sie sollten diesen Code verwenden:

@Nullable
public static String getImagePathFromUri(@Nullable Uri aUri) {
    String imagePath = null;
    if (aUri == null) {
        return imagePath;
    }
    if (DocumentsContract.isDocumentUri(ApplicationContext.get(), aUri)) {
        String documentId = DocumentsContract.getDocumentId(aUri);
        if ("com.Android.providers.media.documents".equals(aUri.getAuthority())) {
            String id = documentId.split(":")[1];
            String selection = MediaStore.Images.Media._ID + "=" + id;
            imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
        } else if ("com.Android.providers.downloads.documents".equals(aUri.getAuthority())) {
            Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
                    Long.valueOf(documentId));
            imagePath = getImagePath(contentUri, null);
        }
    } else if ("content".equalsIgnoreCase(aUri.getScheme())) {
        imagePath = MediaUtils.getImagePath(aUri, null);
    } else if ("file".equalsIgnoreCase(aUri.getScheme())) {
        imagePath = aUri.getPath();
    }
    return imagePath;
}

private static String getImagePath(Uri aUri, String aSelection) {
    String path = null;
    Cursor cursor = ApplicationContext.get()
            .getContentResolver()
            .query(aUri, null, aSelection, null, null);
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
        }
        cursor.close();
    }
    return path;
}
0
SELiOTe