В своем фрагменте приложения я пытаюсь получить масштабированное растровое изображение из изображения во внешнем хранилище. Вот как я выбираю Uri некоторого изображения из внешнего хранилища.
View.OnClickListener galleryClicked = new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_READ_PERMISSION_CODE);
} else {
pickFromGallery();
}
}
};
private void pickFromGallery() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
String[] mimeTypes = {"image/jpeg", "image/png"};
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
// Launching the Intent
startActivityForResult(intent, GALLERY_REQUEST_CODE);
}
Затем я получаю Uri изображения в методе OnActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Result code is RESULT_OK only if the user selects an Image
if(resultCode == Activity.RESULT_OK) {
Bitmap imageBitmap = null;
switch(requestCode) {
case GALLERY_REQUEST_CODE:
//data.getData returns the content URI for the selected Image
Uri selectedImageUri = data.getData();
try {
//here is the problem. imageBitmap is always null.
imageBitmap = BitmapLoader.decodeSampledBitmapFromResource(getActivity(), selectedImageUri, 100, 100);
} catch (IOException e) {
e.printStackTrace();
}
break;
case IMAGE_CAPTURE_REQUEST_CODE:
Bundle extras = data.getExtras();
imageBitmap = (Bitmap) extras.get("data");
break;
}
MessagesManager.getInstance().sendPictureMessage(imageBitmap);
}
}
Как вы видите, у меня есть класс BitmapLoader. Вот код класса
package com.example.vegaproject.tools;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class BitmapLoader {
private BitmapLoader() {
}
private static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) >= reqHeight
&& (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
public static Bitmap decodeSampledBitmapFromResource(Context context, Uri resourceUri, int reqWidth, int reqHeight) throws IOException {
InputStream imageStream = context.getContentResolver().openInputStream(resourceUri);
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(imageStream, null, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeStream(imageStream, null, options);
imageStream.close();
return bitmap;
}
Проблема в том, что метод decodeSampledBitmapFromResource
всегда возвращает null
, и я не могу найти причину. Пожалуйста, помогите.