ユーザーが画像ギャラリーから選択した画像で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());
Android toString
のUri
メソッドは、Java String
のURI
ベースのコンストラクターと組み合わせて使用できます。
Android.net.Uri auri = new Android.net.Uri(what ever);
Java.net.URI juri = new Java.net.URI(auri.toString());
コンテンツURIからInputStreamを開く正しい方法を見つけました:
InputStream fileInputStream=yourContext.getContentResolver().openInputStream(uri);
それで全部です!
Jgilrinconの答えに投票しました。私は評判が悪いためコメントできませんが、ここに追加情報があります-Apache Cordovaプロジェクトの FileHelper.Java を使用できます(およびアプリアセットフォルダー)
特に、このメソッドはUriからInputStreamを提供します。
public static InputStream getInputStreamFromUriString(String uriString, Activity cordova)
元の質問に対する解決策があります(UriをURIに変換):
実際のファイルパスを取得します(このコードを見てください: mediastoreのURIからファイル名とパスを取得 )
実際のパスとコンストラクターを使用してURIを取得します:URI(String uri)
詳細が必要な場合は、こちらをご覧ください。
文字列の構築が機能しないので、自分で構築しようとしましたか?
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クラスが例外をスローしているのは、おそらくこれが原因である可能性があります。