web-dev-qa-db-ja.com

Android-Android.net.UriオブジェクトをJava.net.URIオブジェクトに変換するにはどうすればよいですか?

ユーザーが画像ギャラリーから選択した画像でFileInputStreamオブジェクトを取得しようとしています。これは、Android URIによって返されるAndroid.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI

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

このオブジェクトからJava URIオブジェクトを構築しようとすると、例外の説明でIllegalArgumentExceptionを取得しますRIの期待されるファイルスキーム:content:// media/external/images/media/一方、Android URIはスキームをcontent

更新:元の質問に対する解決策が見つかりませんでした。しかし、画像ギャラリーの画像のバイトストリームが必要な場合は、このコードがそれを行います。

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

Android toStringUriメソッドは、Java StringURIベースのコンストラクターと組み合わせて使用​​できます。

Android.net.Uri auri = new Android.net.Uri(what ever);
Java.net.URI juri = new Java.net.URI(auri.toString());

Android URI | Java URI

51

コンテンツURIからInputStreamを開く正しい方法を見つけました:

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

それで全部です!

40
Fedor

Jgilrinconの答えに投票しました。私は評判が悪いためコメントできませんが、ここに追加情報があります-Apache Cordovaプロジェクトの FileHelper.Java を使用できます(およびアプリアセットフォルダー)

特に、このメソッドはUriからInputStreamを提供します。

public static InputStream getInputStreamFromUriString(String uriString, Activity cordova)
2
Mixaz

元の質問に対する解決策があります(UriをURIに変換):

  1. 実際のファイルパスを取得します(このコードを見てください: mediastoreのURIからファイル名とパスを取得

  2. 実際のパスとコンストラクターを使用してURIを取得します:URI(String uri)

詳細が必要な場合は、こちらをご覧ください。

ACTION_VIDEO_CAPTUREでインテントを使用して記録されたビデオを削除する方法?

2
jgilrincon

文字列の構築が機能しないので、自分で構築しようとしましたか?

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クラスが例外をスローしているのは、おそらくこれが原因である可能性があります。

0