画像を大幅に縮小するために画像をビットマップに変換しようとすると、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 +の画像を取る実際のデバイスで私のアプリをテストし始めたまで、これを無視することができました。