0

画像を大幅に縮小するために画像をビットマップに変換しようとすると、FileNotFound例外が発生します。Uriとビットマップを使ってギャラリーから画像を縮小する

GOT URI: content://media/external/images/media/110 
SET URI: /storage/emulated/0/DIRECTORY/IMG_20170606_154512_1664512804.jpg 
public void setChosenPicture (Activity activity, Intent data) 
{ 
    if(editingViewHelper != null) 
    { 
     String[] filePathColumn = {MediaStore.Images.Media.DATA}; 

     Uri selectedImage = data.getData(); 

     System.out.println("GOT URI: " + selectedImage.toString()); 

     Cursor cursor = activity.getContentResolver().query(selectedImage, filePathColumn, null, null, null); 
     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     editingViewHelper.holder.tempUri = Uri.parse(cursor.getString(columnIndex)); 

     System.out.println("SET URI: " + editingViewHelper.holder.tempUri.toString()); 

     cursor.close(); 

     editingViewHelper.holder.imageView.setImageURI(editingViewHelper.holder.tempUri); 
    } 
} 

この

は、次の出力:ユーザーが選ん行われたときに

私は、そのように

public static void GET_PICTURE_FROM_GALLERY (Activity activity) 
{ 
    Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT); 
    getIntent.setType("image/*"); 

    Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    pickIntent.setType("image/*"); 

    Intent chooserIntent = Intent.createChooser(getIntent, "Select Image"); 
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent}); 

    activity.startActivityForResult(chooserIntent, REQUEST_SELECT_PHOTO); 
} 

のようなギャラリーからユーザーが選択した画像を検索しています

これは素晴らしいですが、私がimageView.setImageUri(uri)を呼び出した場合のみです。しかし、私はアプリが馬鹿の量を使用しないように画像を縮小する必要があるので、私はそれを行うことはできません。これを行うために、私はこの方法

public static Bitmap decodeUri(Context c, Uri uri, final int requiredSize) 
{ 
    System.out.println("URI: " + uri.toString()); 

    try 
    { 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 

//This line is where the error occurs. 
    BitmapFactory.decodeStream(c.getContentResolver().openInputStream(uri), null, o); 

     int width_tmp = o.outWidth; 
     int height_tmp = o.outHeight; 
     int scale = 1; 

     while(true) 
     { 
      if(width_tmp/2 < requiredSize || height_tmp/2 < requiredSize) 
       break; 

      width_tmp /= 2; 
      height_tmp /= 2; 
      scale *= 2; 
     } 

     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 

     return BitmapFactory.decodeStream(c.getContentResolver().openInputStream(uri), null, o2); 
    } 
    catch (FileNotFoundException e) 
    { 
     e.printStackTrace(); 
     return null; 
    } 
} 

を持っているそして最後に、私はにFileNotFound例外

URI: /storage/emulated/0/DIRECTORY/IMG_20170606_154512_1664512804.jpg 
java.io.FileNotFoundException: No content provider: /storage/emulated/0/DIRECTORY/IMG_20170606_154512_1664512804.jpg 

.OUTPUT次ている今、奇妙なことは、この方法作業を行いいることが、それがある場合のみです私のアプリでと撮ったウリをとしました。ここで私はURIの両方のタイプでimageView.setImageUri(URI)を呼び出すことができるが、私は1がダウンして入力する拡張することはできません何らかのエラー

Uri: content://com.subliroid.dinnerdecider.provider/external_files/Pictures/DIRECTORY/IMG_20170606_154512_1664512804.jpg 

をスローしません最後の方法の出力例です。私はエミュレータがとる小さなものに比べて4k +の画像を取る実際のデバイスで私のアプリをテストし始めたまで、これを無視することができました。

答えて

1

最も簡単なことは、by farで、このコードのほとんどを削除し、既存のimage-loading libraryを使用することです。 GoogleはGlideを推奨します。私はPicassoを使用しましたが、他にもたくさんあります。

query()コールがなど多くの状況(リムーバブルストレージ上の画像、あなたがIntentに応じて期待していない可能性がありますアプリケーションを選択するユーザーに失敗します:ユーザーが選ん行われその後

、 )。

そして最後に、私はあなたがUri.parse()に渡している値は持っていないとして、あなたは不必要に新しいUriを作成している、とあなたはそう間違ってやっているにFileNotFound例外

.OUTPUT次ていますスキーム。

既にデバッグ済みのコード(画像読み込みライブラリ)を使用しない場合は、onActivityResult()で与えられたUriをビットマップスケーリングコードに渡します。次に、現在の実装でUIをフリーズしているときに、このロジックのほとんどをメインのアプリケーションスレッドから外す場合を考えます。

関連する問題