2016-05-02 7 views
-3

画像を表示する前に大きすぎる場合に備えて画像の幅と高さを取得しようとしています。私のメソッドは画像のURIを受け取りますが、BitmapFactoryを使用してデコードしようとすると、常にFileNotFoundExceptionが発生します。ここでAndroid:FileNotFoundException Uriから画像を取得しようとしたとき

私のコードのサンプルです:

Uri myUri; 

    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(new File(myUri.getPath()).getAbsolutePath(), options); 

    int imageHeight = options.outHeight; 
    int imageWidth = options.outWidth; 

デコードファイルのリターンはここにFileNotFoundExceptionをスローします。しかし、私はまだこれを使用してビットマップファクトリを使用せずにURIを使用して画像を表示することができます。

 Uri myUri; 

     Bitmap myBitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), myUri); 

このコードの問題は、大きな画像を使用する際に返されたビットマップがOutOfMemoryErrorが発生の原因となる可能性があるということです。

私は私のウリをデバッグするとき、私はこれを取得:

内容://com.android.providers.media.documents/document/image%3A20472

UPDATE ||ここには作業コード

Uri myUri; 

    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 

    // This is the part that changed 
    InputStream inputStream = context.getApplicationContext().getContentResolver().openInputStream(myUri); 
    BitmapFactory.decodeStream(inputStream,new Rect(),options); 

    int imageHeight = options.outHeight; 
    int imageWidth = options.outWidth; 

もちろんこれはtry/catchで囲まれています。

+0

私はAndroidを使って遊んでからしばらくしていますが、FileNotFoundExceptionであるため、返す値が正確にわかるように「new File(myUri.getPath())。getAbsolutePath()」を試してみましたか?そこには何か変わったことがあるかもしれません。 – hennign

+0

myUriについての詳しい情報が必要です。 //com.android.providers.media.documents/document/image%3A20472はこの文脈でどのような内容を意味するのかわかりません。 – hennign

答えて

0

decodeFileの代わりにdecodeStreamを使用してください。

getContentResolver().openInputStream(myUri)でストリームを開きます。

+0

これは本当に問題でした。ありがとうございました。コードの結果を得るために質問を更新しました。 – Sprawl

0

これをしばらく再生した後、おそらく画像ファイルが実際には存在しないと思われます。

あなたのコンピュータ上のローカルファイルにアクセスしようとすると、そのファイルは実際にアプリケーションが実行されているAndroidサンドボックスには存在しません。あなたはそれをリソースとしてアプリケーションに追加してから、ファイルではなくリソースとしてアクセスする必要があります。

ウェブ画像にアクセスしようとしている場合は、まずそれをダウンロードする必要があります。ウェブイメージ 'http://example.com/example.jpg'のAbsolutePathは '/example.jpg'になります。開こうとするとあまり良くありません。

+0

私は実際のアンドロイドデバイスでテストしていますが、サンドボックスではテストしていません。 コンテキストを追加するには、ユーザーは自分のデバイスから画像を選択するよう求められます。ユーザが画像を選択した後に呼び出されるメソッド "onActivityResult"では、uriは、Intent passed asパラメータのデータを使用して作成されます。 URIはそうのように定義される: 公共ボイドonActivityResult(INT requestCode、INT resultCodeが、インテントデータ){ ウリmyUri = data.getData()。 ...} – Sprawl

関連する問題