Jaki jest najłatwiejszy sposób konwersji z file:
android.net.Uri
na File
Android?
Próbowałem następujących, ale to nie działa:
final File file = new File(Environment.getExternalStorageDirectory(), "read.me");
Uri uri = Uri.fromFile(file);
File auxFile = new File(uri.toString());
assertEquals(file.getAbsolutePath(), auxFile.getAbsolutePath());
Odpowiedzi:
To czego chcesz to ...
... i nie...
UWAGA:
uri.toString()
Zwraca ciąg znaków w formacie:"file:///mnt/sdcard/myPicture.jpg"
, natomiasturi.getPath()
zwraca ciąg w formacie:"/mnt/sdcard/myPicture.jpg"
.źródło
toString
zrobić?url.toString()
zwraca ciąg w następującym formacie: „plik: ///mnt/sdcard/myPicture.jpg”, podczas gdyurl.getPath()
zwraca ciąg w następującym formacie: „/mnt/sdcard/myPicture.jpg”, tzn. bez typu schematu naprawiony.open failed: ENOENT (No such file or directory)
gdy próbuję otworzyć podany plik. Ponadto, jeśli Uri jest na przykład Uri treści obrazu, to na pewno nie działa.Po długich poszukiwaniach, to działało dla mnie:
źródło
managedQuery
jest teraz przestarzałegetContentResolver().query(...)
zamiast tego użyj , który działa na API 11+. Dodaj warunek dla urządzeń starszych niż API 11.posługiwać się
bezpośrednio i skopiuj plik. Zobacz także:
https://developer.android.com/guide/topics/providers/document-provider.html
źródło
EDYCJA: Przepraszam, powinienem był wcześniej przetestować lepiej. To powinno działać:
Identyfikator URI to java.net.URI.
źródło
androidURI
to android.net.Uri. java.net.URI (który istnieje na Androidzie) jest używany tylko jako część procesu konwersji.java.lang.IllegalArgumentException: Expected file scheme in URI: content://com.shajeel.daily_monitoring.localstorage.documents.localstorage.documents/document/%2Fstorage%2Femulated%2F0%2FBook1.xlsx
wyjątek po użyciu tej metody.Najlepsze rozwiązanie
Utwórz jedną prostą klasę FileUtil i użyj jej do utworzenia, skopiowania i zmiany nazwy pliku
Używam
uri.toString()
iuri.getPath()
nie pracuję dla mnie. W końcu znalazłem to rozwiązanie.Użyj klasy FileUtil w swoim kodzie
źródło
Nic z tego nie działa dla mnie. Znalazłem to działające rozwiązanie. Ale moja sprawa jest specyficzna dla obrazów .
źródło
Android + Kotlin
Dodaj zależność dla rozszerzeń Kotlin dla Androida:
implementation 'androidx.core:core-ktx:{latestVersion}'
Pobierz plik z URI:
uri.toFile()
Android + Java
Po prostu przejdź na górę;)
źródło
file
Z Kotlin jest jeszcze łatwiej:
Lub jeśli używasz rozszerzeń Kotlin dla Androida :
źródło
@CommonsWare całkiem dobrze wyjaśnił wszystkie rzeczy. I naprawdę powinniśmy skorzystać z zaproponowanego przez niego rozwiązania.
Nawiasem mówiąc, tylko informacje, na których mogliśmy polegać podczas wyszukiwania,
ContentResolver
to nazwa i rozmiar pliku, jak wspomniano tutaj: Pobieranie informacji o pliku | Programiści AndroidaJak widać, istnieje interfejs
OpenableColumns
zawierający tylko dwa pola: DISPLAY_NAME i SIZE.W moim przypadku musiałem pobrać informacje EXIF dotyczące obrazu JPEG i obrócić je w razie potrzeby przed wysłaniem na serwer. W tym celu skopiowałem zawartość pliku do pliku tymczasowego za pomocą
ContentResolver
iopenInputStream()
źródło
Zrobiłem to w następujący sposób:
Zasadniczo najpierw próbuję użyć pliku, tj. Zdjęcia zrobionego aparatem i zapisanego na karcie SD. To nie działa dla obrazu zwróconego przez: Intent photoPickerIntent = nowy Intent (Intent.ACTION_PICK); W takim przypadku należy przekonwertować Uri na ścieżkę rzeczywistą według
getRealPathFromURI()
funkcji. Wniosek jest taki, że zależy to od tego, jaki typ Uri chcesz przekonwertować na plik.źródło
Jeśli masz taki,
Uri
który jest zgodny z tymDocumentContract
, prawdopodobnie nie chcesz go używaćFile
. Jeśli jesteś na kotlinie, użyjDocumentFile
rzeczy, których używałbyś w starym świecieFile
, i używajContentResolver
aby uzyskać strumienie.Wszystko inne jest prawie całkowicie zepsute.
źródło
W tym przypadku, szczególnie na Androidzie, droga do bajtów jest zwykle szybsza.
Dzięki temu rozwiązałem to, ustanawiając klasę
FileHelper
której powierzono odpowiedzialność za odczytywanie / zapisywanie bajtów z / do pliku poprzez strumień, oraz klasę,UriHelper
której powierzono obowiązek ustalenia ścieżki Uri i pozwolenia.O ile ogólnie wiadomo,
string.getBytes((charset == null) ? DEFAULT_CHARSET:charset)
może pomóc nam przenieść ciąg znaków, który chcesz bajtów, których potrzebujesz.Jak zezwolić UriHelper i FileHelper na skopiowanie obrazu zaznaczonego przez Uri do pliku, możesz uruchomić:
o moim UriHelper:
}
o moim FileHelper:
}
źródło
Dla osób, które tutaj szukają rozwiązania dla obrazów w szczególności tutaj jest.
źródło
Plik imageToUpload = nowy plik (nowy URI (androidURI.toString ())); działa, jeśli jest to plik utworzony w pamięci zewnętrznej.
Na przykład plik: /// storage / emulated / 0 / (niektóre nazwy katalogów i plików)
źródło
public String getRealPathFromURI (Uri uri) {
Następnie za pomocą, aby uzyskać plik z URI:
- NADZIEJA MOŻE CI POMÓC ----
źródło
Dzięki poniższemu kodowi jestem w stanie uzyskać udostępniony plik pdf aplikacji Adobe jako strumień i zapisać w ścieżce aplikacji Androida
źródło
Rozszerzenie bazy na odpowiedź @Jacek Kwiecień na konwersję obrazu uri do pliku
Jeśli użyjemy
File(uri.getPath())
, to nie będzie działaćJeśli użyjemy rozszerzenia z Androida-ktx , nadal nie będzie działać, ponieważ https://github.com/android/android-ktx/blob/master/src/main/java/androidx/core/net/Uri.kt
źródło
DATA
kolumny (i to było przede wszystkim niewiarygodne).Dodaj
onActivityResult
, pobierz plik docx lub pdfźródło