Znam bezwzględną ścieżkę obrazu (np. /Sdcard/cats.jpg). Czy jest jakiś sposób, aby uzyskać identyfikator treści dla tego pliku?
Właściwie w kodzie pobieram obraz i zapisuję go w określonej lokalizacji. Aby ustawić obraz w instancji ImageView, obecnie otwieram plik za pomocą ścieżki, pobieram bajty i tworzę mapę bitową, a następnie ustawiam bitmapę w instancji ImageView. Jest to bardzo powolny proces, zamiast tego, gdybym mógł pobrać treść uri, bardzo łatwo mógłbym użyć tej metody imageView.setImageUri(uri)
Odpowiedzi:
Spróbuj z:
Lub z:
źródło
Uri.fromFile
nie będzie działać naAKTUALIZACJA
Mam to samo pytanie dotyczące mojej aktywności eksploratora plików. Powinieneś wiedzieć, że contenturi pliku obsługuje tylko dane mediastore, takie jak obraz, audio i wideo. Daję ci kod do pobierania treści obrazu z wyboru obrazu z sdcard. Wypróbuj ten kod, może Ci się uda ...
źródło
MediaStore.Images.Media
sięMediaStore.Video.Media
, ale nadal nie ma szczęścia.// Ten kod działa dla obrazów w wersji 2.2, nie jestem pewien, czy są jakieś inne typy multimediów
źródło
Przyjęte rozwiązanie jest prawdopodobnie najlepszym wyborem dla twoich celów, ale aby odpowiedzieć na pytanie w temacie:
W mojej aplikacji muszę uzyskać ścieżkę z identyfikatorów URI i uzyskać identyfikator URI ze ścieżek. Były:
Ten ostatni (który robię w przypadku filmów, ale można go również użyć do 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 używasz tych informacji, aby ją wyszukać.źródło
OpenableColumns.DISPLAY_NAME & OpenableColumns.SIZE
jeśli aplikacja wysyłająca nawet przestrzega „reguł”. Odkryłem, że niektóre duże aplikacje zwracają tylko te dwa pola, a nie zawsze_data
pole. W przypadku, gdy nie masz pola danych, które zwykle zawiera bezpośrednią ścieżkę do treści, musisz najpierw odczytać zawartość i zapisać ją w pliku lub w pamięci, a następnie masz własną ścieżkę.Możesz użyć tych dwóch sposobów w zależności od użycia
Uri uri = Uri.parse("String file location");
lub
Uri uri = Uri.fromFile(new File("string file location"));
Próbowałem obu sposobów i oba działają.
źródło
Najłatwiejszym i najskuteczniejszym sposobem tworzenia treści Uri
content://
z pliku jest użycie FileProvider . Uri dostarczone przez FileProvider może być również używane do udostępniania plików innym aplikacjom. Aby pobrać Uri pliku z bezwzględnej ścieżkiFile
, możesz użyć DocumentFile.fromFile (nowy plik (ścieżka, nazwa)), został dodany w Api 22 i zwraca null dla wersji poniżej.źródło
Jest późno, ale może komuś pomóc w przyszłości.
Aby uzyskać identyfikator URI treści dla pliku, możesz użyć następującej metody:
FileProvider.getUriForFile(Context context, String authority, File file)
Zwraca identyfikator URI treści.
Sprawdź to, aby dowiedzieć się, jak skonfigurować
FileProvider
źródło
Uzyskiwanie identyfikatora pliku bez pisania kodu, tylko za pomocą poleceń CLI powłoki adb:
źródło
Permission Denial: Do not have permission in call getContentProviderExternal() from pid=15660, uid=10113 requires android.permission.ACCESS_CONTENT_PROVIDERS_EXTERNALLY
, że dostaniesz:, chyba że jesteś zrootowany.Lepiej jest użyć sprawdzania poprawności do obsługi wersji wcześniejszych niż Android N, na przykład:
https://es.stackoverflow.com/questions/71443/reporte-crash-android-os-fileuriexposedexception-en-android-n
źródło
Możesz wypróbować poniższy fragment kodu
źródło