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:
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();
}
}
}
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.
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;
}