Mam onActivityResult
powrót z wyboru obrazu mediastore, który mogę uzyskać identyfikator URI obrazu za pomocą następujących czynności:
Uri selectedImage = data.getData();
Konwersja tego na ciąg daje to:
content://media/external/images/media/47
Lub ścieżka daje:
/external/images/media/47
Jednak nie mogę znaleźć sposobu na przekonwertowanie tego na ścieżkę bezwzględną, ponieważ chcę załadować obraz do mapy bitowej bez konieczności kopiowania go gdzieś. Wiem, że można to zrobić za pomocą identyfikatora URI i programu rozpoznawania treści, ale wydaje się, że to się psuje po ponownym uruchomieniu telefonu, ale chyba MediaStore
nie utrzymuje tej samej numeracji między restartami.
android
uri
absolute-path
mediastore
stealthcopter
źródło
źródło
Odpowiedzi:
Poniżej API 19 użyj tego kodu, aby uzyskać ścieżkę pliku z URI:
źródło
Prosta aktualizacja pierwszej odpowiedzi:
mActivity.managedQuery()
jest teraz przestarzała. Zaktualizowałem kod nową metodą.Android dev source
źródło
content://...
. Wypróbowałem wszystkie sugestie tutaj bez powodzenia. Masz pomysł, dlaczego?Dla Oreo
Dla wszystkich wersji poniżej Oreo stworzyłem tę metodę, która pobiera prawdziwą ścieżkę z Uri
źródło
Nie próbuj znaleźć identyfikatora URI w systemie plików, to jest powolne, aby szukać rzeczy w bazie danych.
Możesz pobrać bitmapę z URI, podając strumień wejściowy do fabryki, tak jak dajesz plik do fabryki:
źródło
Oto mój przykład pobierania nazwy pliku z identyfikatora URI typu plik: // ... i treść: // .... Działa to dla mnie nie tylko z Android MediaStore, ale także z aplikacjami trzeciej części, takimi jak EzExplorer.
źródło
Dobre istniejące odpowiedzi, niektóre z nich wymyśliłem własne:
Muszę pobrać ścieżkę z identyfikatorów URI i uzyskać identyfikator URI ze ścieżek, a Google ma trudności z odróżnieniem, więc dla każdego, kto ma ten sam problem (np. Aby uzyskać miniaturę z
MediaStore
filmu, którego fizyczną lokalizację już masz) ). Były:Ten ostatni (który robię w przypadku filmów, ale można go również użyć do plików audio lub plików lub innych rodzajów przechowywanych treści, zastępując MediaStore.Audio (itp.) Zamiast MediaStore.Video):
Zasadniczo
DATA
kolumnaMediaStore
(lub którejkolwiek podsekcji, o którą pytasz) przechowuje ścieżkę pliku, więc albo użyj tego, co wiesz, aby wyszukać toDATA
pole, albo użyj pola, aby wyszukać cokolwiek innego.Następnie używam
Scheme
powyższego, aby dowiedzieć się, co zrobić z moimi danymi:źródło
Żadna z tych odpowiedzi nie działała dla mnie we wszystkich przypadkach. Musiałem przejść bezpośrednio do Dokumentacji Google https://developer.android.com/guide/topics/providers/document-provider.html na ten temat i znalazłem tę przydatną metodę:
Możesz użyć tej mapy bitowej do wyświetlenia jej w widoku obrazu.
źródło
API 19 i wyżej , ścieżka pliku obrazu z Uri działa idealnie. Sprawdzam również ten najnowszy PIE API 28 .
źródło
CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
w tym wierszu:path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
spróbuj pobrać ścieżkę pliku obrazu z Uri
źródło
Rozwiązanie dla tych, którzy mają problem po przejściu na KitKat:
„Spowoduje to pobranie ścieżki pliku od MediaProvider, DownloadsProvider i ExternalStorageProvider, jednocześnie wracając do nieoficjalnej metody ContentProvider” https://stackoverflow.com/a/20559175/690777
źródło
Po uzyskaniu obrazu z galerii wystarczy przekazać identyfikator URI w poniższej metodzie tylko dla Androida 4.4 (KitKat):
źródło
Spróbuj tego
Jeśli jednak masz problem z uzyskaniem prawdziwej ścieżki, możesz wypróbować moje odpowiedzi. Powyższe odpowiedzi nie pomogły mi.
Objaśnienie : - Ta metoda pobiera identyfikator URI, a następnie sprawdza poziom interfejsu API urządzenia Android, a następnie zgodnie z poziomem interfejsu API wygeneruje ścieżkę rzeczywistą. Kod do generowania rzeczywistej metody ścieżki różni się w zależności od poziomów API.
metoda uzyskania rzeczywistej ścieżki z URI
Użyj tej metody w ten sposób
Wynik:-
źródło
String wholeID = DocumentsContract.getDocumentId(uri);
które otrzymuję:java.lang.RuntimeException: Failure delivering result
Zrobiłem tak:
źródło
Ponieważ manageQuery jest przestarzałe, możesz spróbować:
źródło
Tutaj pokażę ci, jak utworzyć przycisk PRZEGLĄDAJ, który po kliknięciu otworzy kartę SD, wybierzesz plik, w wyniku czego otrzymasz nazwę pliku i ścieżkę pliku wybranego jeden:
Przycisk, który uderzysz
Funkcja, która otrzyma wynikową nazwę pliku i ścieżkę pliku
źródło
content://com.fsck.k9.attachmentprovider/34fc2cc9-aa46-45e9-9e3f-2f27f0457249/1/VIEW
. Po zastosowaniu tutaj metod nadal otrzymuję ten sam ciąg, a nie prawidłową ścieżkę/mnt/sdcard/Android/data/com.fsck.k9/files/34fc2cc9-aa46-45e9-9e3f-2f27f0457249.db_att/1
. Jakieś wskazówki?Jakikolwiek sposób dla poprzedniego Androida Q , kiedy MediaStore.Images.Media.DATA nie będzie już dostępny? To pole jest amortyzowane w Androidzie Q:
https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#DATA
--- Edytowane
O ile wiem dla poprzedniego Androida Q, jedynym sposobem jest przekazanie RELATIVE_PATH
https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#RELATIVE_PATH
źródło
Nieznacznie zmodyfikowana wersja @PercyPercy - nie rzuca i po prostu zwraca null, jeśli coś pójdzie nie tak :
źródło
Tutaj masz nazwę pliku
źródło
Proste i łatwe. Możesz to zrobić z URI, tak jak poniżej!
źródło
To rozwiązanie działa w każdym przypadku:
W niektórych przypadkach jest to zbyt trudne, aby uzyskać ścieżkę z adresu URL. Dlaczego więc potrzebujesz ścieżki? Aby skopiować plik w inne miejsce? Nie potrzebujesz ścieżki.
źródło
Idealnie działający dla mnie poprawiony kod z tego postu :
źródło
Jako dodatek, jeśli chcesz sprawdzić, czy plik istnieje, zanim spróbujesz otworzyć strumień wejściowy, możesz użyć DocumentsContract.
(Kod Kotlin)
źródło
Ponieważ powyższe odpowiedzi nie działały dla mnie, oto rozwiązanie, które działało dla mnie:
Zarówno dla> 19, jak i <= 19 poziomów API.
Ta metoda obejmuje wszystkie przypadki pobierania filePath z URI
źródło
Aby uzyskać dowolną ścieżkę do pliku, użyj tego:
źródło
Sprawdź poniżej metoda działa świetnie również Oreo 8.1 ..
Klasa ścieżki URI:
źródło
Robię to za pomocą jednej wkładki:
val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri)
Który w onActivityResult wygląda następująco:
źródło
Sprawy są teraz skomplikowane, zwłaszcza po Android API na poziomie 29. Pytanie. W ten sposób powinieneś pobrać nazwę pliku z treści Uri
i w ten sposób uzyskasz pełną ścieżkę Uri treści dla wszystkich wersji Androida
źródło
Działa to dla mnie idealnie, jeśli twoja wersja systemu jest wyższa niż 19, mam nadzieję, że to może ci pomóc.
źródło
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
źródło