2009-02-18 9 views
44

Próbuję uzyskać obiekt FileInputStream na obrazie wybranym przez użytkownika z galerii obrazów. Jest to android URI zwrócony przez android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URIAndroid - w jaki sposób mogę przekonwertować obiekt android.net.Uri na obiekt java.net.URI?

treści: // media/zewnętrzna/images/media/3

Kiedy próbuję skonstruować java URI obiektu z tego obiektu, otrzymuję IllegalArgumentException z opisem wyjątków Oczekiwany system plików w URI: treść: // media/zewnętrzne/images/media/3 natomiast android URI pokazuje schemat jak zawartości

Nigdy nie znalazł rozwiązanie dla pierwotnego pytania. Ale jeśli chcesz strumień bajtów obrazu w galerii zdjęć, ten fragment kodu to zrobi.

Bitmap bitmap = Media.getBitmap(getContentResolver(), imageUri); 
ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 
ByteArrayInputStream fileInputStream = new ByteArrayInputStream(bytes.toByteArray()); 

Odpowiedz

40

Można zastosować metodę android UritoString w kombinacji opartej konstruktora Java URI na String.

android.net.Uri auri = new android.net.Uri(what ever); 
java.net.URI juri = new java.net.URI(auri.toString()); 

Android URI | Java URI

+3

Dzięki. Próbowałem tego. Daje wyjątek (java.net.URI powinien mieć poprawny schemat) – lostInTransit

+8

jest to błędne i zakończy się niepowodzeniem, jeśli identyfikator URI zawiera znaki, które wymagają kodowania (np. Spacja). android.net.Uri.toString() dekoduje zakodowane znaki, a java.net.URI rzuci wyjątek, jeśli spróbujesz skonstruować go na niezakodowanym łańcuchu. poprawne rozwiązanie 'huri = new java.net.URI (URLEncoder.encode (auri.toString()," UTF-8 ");' –

+0

@Jeffrey: Uri.toString() zwraca zakodowane znaki na moim Androidzie 4.1.2 urządzenie –

0

Ponieważ konstrukcja String nie działa, czy próbowałeś po prostu zbudować ją samodzielnie?

android.net.URI auri = new android.net.URI(what ever); 
java.net.URI juri = new java.net.URI(auri.getSchema(), 
            auri.getSchemaSpecificPart(), 
            auri.getFragment()); 

Możesz również sprawdzić, czy otrzymujesz prawidłowe dane z klasy URI Androida. Dokumenty wymienione w mojej drugiej odpowiedzi omawiają, w jaki sposób praktycznie nie sprawdza błędów. Jeśli w rzeczywistości wystąpi błąd, klasa wypluwa śmieci i nie rzuca żadnych wyjątków. Które może bardzo prawdopodobne, dlaczego klasa java, która robi sprawdzanie poprawności, rzuca wyjątek.

+0

Dzięki Brian. Uri jest zwracana przez samego Androida. zawiera ścieżkę obrazu w galerii zdjęć telefonu. więc nic nie może zrobić z obrazem. Spróbuję opublikować uri w pytaniach – lostInTransit

+0

Myślę, że chodziło Ci o getScheme i getSchemeSpecificPart, prawda? – Piotr

38

Znaleziono prawidłowy sposób otwierania InputStream od zawartości URI:

InputStream fileInputStream=yourContext.getContentResolver().openInputStream(uri); 

To wszystko!

+2

Dziękujemy! tak prosty, wiedziałem, że gdzieś tam jest. Przyjęta odpowiedź może działać w niektórych przypadkach, ale nie wydaje się być bezpieczna/funkcjonalna we wszystkich przypadkach. – plainjimbo

+0

Wielkie dzięki! Działa jako urok, gdy potrzebujesz uzyskać bajt [] z obrazu wybranego w galerii! –

+0

Ta siła zamyka moją aplikację i otwiera plik Binder.class bez dołączonego źródła. Wysyłam Contacts.CONTENT_VCF_URI – tasomaniac

1

Głosowałem za odpowiedzią jgilrincona.Nie mogę komentować z powodu niskiej reputacji, a tutaj jest kilka dodatkowych informacji - możesz użyć FileHelper.java z projektu Apache Cordova, ma on funkcje potrzebne do obsługi plików z ciągów Uri, biorąc pod uwagę także mediastore (i folder aktywów aplikacji)

Szczególnie ta metoda zapewnia InputStream od Uri:

public static InputStream getInputStreamFromUriString(String uriString, Activity cordova) 
Powiązane problemy