Android студия получает масштабированное растровое изображение из inputStream - PullRequest
0 голосов
/ 25 марта 2020

В своем фрагменте приложения я пытаюсь получить масштабированное растровое изображение из изображения во внешнем хранилище. Вот как я выбираю 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, и я не могу найти причину. Пожалуйста, помогите.

...