Korzystam z menedżera plików innej firmy, aby wybrać plik (w moim przypadku PDF) z systemu plików.
Tak rozpoczynam działanie:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(getString(R.string.app_pdf_mime_type));
intent.addCategory(Intent.CATEGORY_OPENABLE);
String chooserName = getString(R.string.Browse);
Intent chooser = Intent.createChooser(intent, chooserName);
startActivityForResult(chooser, ActivityRequests.BROWSE);
Oto, co mam w onActivityResult
:
Uri uri = data.getData();
if (uri != null) {
if (uri.toString().startsWith("file:")) {
fileName = uri.getPath();
} else { // uri.startsWith("content:")
Cursor c = getContentResolver().query(uri, null, null, null, null);
if (c != null && c.moveToFirst()) {
int id = c.getColumnIndex(Images.Media.DATA);
if (id != -1) {
fileName = c.getString(id);
}
}
}
}
Fragment kodu jest zapożyczony z instrukcji Open Intents File Manager dostępnych tutaj:
http://www.openintents.org/en/node/829
Celem if-else
jest kompatybilność wsteczna. Zastanawiam się, czy to najlepszy sposób na uzyskanie nazwy pliku, ponieważ odkryłem, że inne menedżery plików zwracają wszelkiego rodzaju rzeczy.
Na przykład Documents ToGo zwracają coś podobnego do następującego:
content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf
na który getContentResolver().query()
wraca null
.
Żeby było ciekawiej, nienazwany menedżer plików (dostałem ten URI z dziennika klienta) zwrócił coś takiego:
/./sdcard/downloads/.bin
Czy istnieje preferowany sposób wyodrębnienia nazwy pliku z identyfikatora URI, czy też należy skorzystać z analizy ciągu?
Odpowiedzi:
developer.android.com ma ładny przykładowy kod do tego: https://developer.android.com/guide/topics/providers/document-provider.html
Wersja skrócona, aby po prostu wyodrębnić nazwę pliku (zakładając, że „to” jest działaniem):
źródło
file://
nacontent://
wonScanCompleted(String path, Uri uri)
metodzie stackoverflow.com/a/5815005/2163045new String[]{OpenableColumns.DISPLAY_NAME}
drugiego parametru do zapytania spowoduje odfiltrowanie kolumn w celu uzyskania bardziej wydajnego żądania.OpenableColumns.DISPLAY_NAME
nie działa dla mnie,MediaStore.Files.FileColumns.TITLE
zamiast tego użyłem .java.lang.IllegalArgumentException: Invalid column latitude
niestety. Działa jednak idealnie do zdjęć!Używam czegoś takiego:
źródło
cursor
nie jestclose()
d?Zaczerpnięte z pobierania informacji o pliku | Programiści Androida
Pobieranie nazwy pliku.
źródło
Najłatwiejsze sposoby uzyskania nazwy pliku:
Jeśli nie podają ci właściwej nazwy, powinieneś użyć:
źródło
File(uri.path).name
działa, dziękuję!Jeśli chcesz, żeby był krótki, to powinno działać.
źródło
Używam poniższego kodu, aby uzyskać nazwę pliku i rozmiar pliku z Uri w moim projekcie.
źródło
Najbardziej skondensowana wersja:
źródło
W przypadku Kotlina możesz użyć czegoś takiego:
źródło
źródło
źródło
Moja wersja odpowiedzi jest w rzeczywistości bardzo podobna do @Stefan Haustein. Znalazłem odpowiedź na stronie programistów Androida Pobieranie informacji o pliku ; informacje tutaj są jeszcze bardziej skondensowane na ten konkretny temat niż w witrynie przewodnika Storage Access Framework . W wyniku zapytania indeks kolumny zawierający nazwę pliku to
OpenableColumns.DISPLAY_NAME
. Żadne inne odpowiedzi / rozwiązania dotyczące indeksów kolumn nie zadziałały dla mnie. Poniżej znajduje się przykładowa funkcja:źródło
Najpierw musisz przekonwertować
URI
obiekt naURL
obiekt, a następnie użyćFile
obiektu do pobrania nazwy pliku:To wszystko, bardzo łatwe.
źródło
Funkcja Stefana Hausteina dla Xamarin / C #:
źródło
Jeśli chcesz mieć nazwę pliku z rozszerzeniem, używam tej funkcji, aby ją pobrać. Działa również z wyborem plików z dysku Google
źródło
To faktycznie zadziałało dla mnie:
źródło
Spróbuj tego:
źródło
Połączenie wszystkich odpowiedzi
Oto, do czego doszedłem po przeczytaniu wszystkich przedstawionych tutaj odpowiedzi, a także co zrobili niektórzy Airgram w swoich SDK - narzędzie, które otworzyłem na Github:
https://github.com/mankum93/UriUtilsAndroid/tree/master/app/src/main/java/com/androiduriutils
Stosowanie
Tak proste, jak dzwoni
UriUtils.getDisplayNameSize()
. Zawiera zarówno nazwę, jak i rozmiar treści.Uwaga: działa tylko z content: // Uri
Oto rzut oka na kod:
źródło