Android - как мога да конвертирам обект android.net.Uri в обект java.net.URI?

Опитвам се да получа FileInputStream обект върху изображение, което потребителят избира от галерията с картини. Това е андроидът URI върнат от android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI

content://media/external/images/media/3

Когато се опитам да създам Java URI обект от този обект, получавам IllegalArgumentException с описание на изключение Очаквана файлова схема в URI: content://media/external/images/media/3, докато android URI показва схемата като съдържание

Актуализация: Никога не намерих решение за оригиналния въпрос. Но ако искате потока от байтове на изображение в галерията със снимки, тази част от кода ще направи това.

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

person lostInTransit    schedule 18.02.2009    source източник


Отговори (5)


Можете да използвате метода toString на android Uri в комбинация с базирания на String конструктор на Java URI.

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

URI адрес на Android | URI адрес на Java

person Brian Gianforcaro    schedule 18.02.2009
comment
Благодаря. Опитах това. Дава изключение (java.net.URI трябва да има валидна схема) - person lostInTransit; 19.02.2009
comment
това е грешно и ще се провали, ако URI има знаци, които се нуждаят от кодиране (като интервал). android.net.Uri.toString() декодира кодирани символи и java.net.URI ще хвърли изключение, ако се опитате да го конструирате върху некодиран низ. правилното решение huri = new java.net.URI(URLEncoder.encode(auri.toString(), "UTF-8")); - person Jeffrey Blattman; 01.03.2013
comment
@Jeffrey: Uri.toString() връща кодирани знаци на моето устройство с Android 4.1.2 - person Rémy DAVID; 20.03.2013
comment
@RémyDAVID не го прави. просто го пробвах. за a.n.Uri с интервал в него, интервалът не се кодира. опитайте сами: Uri.parse("content://foo.bar.com/0?file=my goodness").toString(). прав сте, че javadocs посочва, че връща кодиран низ, но не казва какъв вид кодиране се използва. - person Jeffrey Blattman; 20.03.2013

Намерих правилния начин за отваряне на InputStream от URI на съдържанието:

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

Това е всичко!

person Fedor    schedule 24.04.2009
comment
Благодаря ти!!! толкова просто, знаех, че е там някъде. Приетият отговор може да работи в някои случаи, но не изглежда да е безопасен/функционален във всички случаи. - person plainjimbo; 19.08.2011
comment
Благодаря много!!!! Работи като чар, когато трябва да получите byte[] от изображение, избрано във вградената галерия! - person Alex Bush; 28.02.2012
comment
Тази сила затваря приложението ми и отваря Binder.class без прикачен източник. Изпращам Контакти.CONTENT_VCF_URI - person tasomaniac; 14.10.2012

Има решение на вашия първоначален въпрос (конвертиране на Uri в URI):

  1. Вземете истинския път на файла (вижте този код: Вземете име на файл и път от URI от mediastore)

  2. Вземете URI, като използвате реалния път и конструктора: URI(String uri)

Ако имате нужда от повече подробности, вижте тук:

Как да изтриете видеоклип, записан с Намерение с ACTION_VIDEO_CAPTURE?

person jgilrincon    schedule 30.06.2011

Гласувах за отговора на jgilrincon. Не мога да коментирам поради ниска репутация и ето малко допълнителна информация - можете да използвате FileHelper.java от проекта Apache Cordova, има функции, от които се нуждаете за обработка на файлове от Uri низове, като се има предвид и mediastore (и папка с активи на приложението)

По-специално този метод осигурява InputStream от Uri:

public static InputStream getInputStreamFromUriString(String uriString, Activity cordova)
person Mixaz    schedule 19.09.2013

Тъй като конструирането на низ не работи, опитахте ли просто да го конструирате сами?

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

Може също да искате да проверите отново дали получавате валидни данни от Android URI клас. Документите, изброени в другия ми отговор, обсъждат как не прави почти никаква проверка за грешки. Ако в действителност има грешка, класът просто изплюва боклука така или иначе и не хвърля никакви изключения. Което много вероятно може да е причината Java класът, който прави валидиране, да хвърля изключение.

person Brian Gianforcaro    schedule 19.02.2009
comment
Благодаря Браян. Uri се връща от самия android. съдържа пътя на изображение в галерията с картинки на телефона. така че не мога да направя нищо за изображението. Ще се опитам да публикувам uri във въпросите - person lostInTransit; 21.02.2009
comment
Мисля, че имахте предвид getScheme и getSchemeSpecificPart, нали? - person Piotr; 27.06.2014