NullPointerException Не удается найти растровое изображение из рисунков на устройстве oppo

я пытаюсь получить imageview из drawable и изменить его размер, мой текущий код работает на всех устройствах, кроме устройств oppo, он падает внутри метода crop()

сбой, который я получаю, находится в первой строке методаcrop(), который вы можете найти ниже

Caused by: java.lang.NullPointerException: 

мой текущий код:

public Bitmap getTileBitmap(int id, int size) {
    String string = tileUrls.get(id);
    if (string.contains(Themes.URI_DRAWABLE)) {
        String drawableResourceName = string.substring(Themes.URI_DRAWABLE.length());
        int drawableResourceId = Shared.context.getResources().getIdentifier(drawableResourceName, "drawable", Shared.context.getPackageName());
        Bitmap bitmap = Utils.scaleDown(drawableResourceId, size, size);
        return Utils.crop(bitmap, size, size);

    }
    return null;
}


public static Bitmap crop(Bitmap source, int newHeight, int newWidth) {
    int sourceWidth = source.getWidth();
    int sourceHeight = source.getHeight();
    float xScale = (float) newWidth / sourceWidth;
    float yScale = (float) newHeight / sourceHeight;
    float scale = Math.max(xScale, yScale);
    float scaledWidth = scale * sourceWidth;
    float scaledHeight = scale * sourceHeight;
    float left = (newWidth - scaledWidth) / 2;
    float top = (newHeight - scaledHeight) / 2;
    RectF targetRect = new RectF(left, top, left + scaledWidth, top + scaledHeight);
    Bitmap dest = Bitmap.createBitmap(newWidth, newHeight, source.getConfig());
    Canvas canvas = new Canvas(dest);
    canvas.drawBitmap(source, null, targetRect, null);

    return dest;
}

РЕДАКТИРОВАТЬ: добавлен метод масштабирования, который может вызвать проблему

public static Bitmap scaleDown(int resource, int reqWidth, int reqHeight) {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(Shared.context.getResources(), resource);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(Shared.context.getResources(), resource, options);
}

и до сих пор я не уверен, что вызывает сбой только на устройствах oppo


person Hossam Hassan    schedule 08.02.2021    source источник
comment
Предположительно Utils.scaleDown() возвращает null.   -  person CommonsWare    schedule 08.02.2021
comment
Вам нужно будет проверить Utils.scaleDown() и отладить, почему он возвращает null на устройствах Oppo.   -  person c0delama    schedule 08.02.2021
comment
я обновил вопрос   -  person Hossam Hassan    schedule 08.02.2021
comment
я не могу отлаживать, потому что устройство, которое у меня есть, и мой эмулятор не дают сбоев, но я получаю сбой на одном из телефонов пользователей   -  person Hossam Hassan    schedule 08.02.2021
comment
Но вы можете добавить проверку на bitmap==null и отобразить всплывающее уведомление и остановить/возврат вместо того, чтобы позволить вашему приложению сбой. Также отобразите inSampleSize, затем и разрешение.   -  person blackapps    schedule 08.02.2021
comment
я добавил if (bitmap == null) {return null; } else { return Utils.crop(bitmap, size, size); } но когда я отправляю apk пользователю, чтобы проверить его на своем телефоне, он получает все изображения пустыми, но сбой прекратился, теперь нужно выяснить, что вызывает нулевое растровое изображение на устройстве oppo   -  person Hossam Hassan    schedule 08.02.2021
comment
Это просто выстрел в темноту, но вы можете попробовать использовать getApplicationContext() вместо (или вместо) Shared.context. Вполне может быть, что используемый вами контекст недоступен на этих конкретных устройствах.   -  person c0delama    schedule 08.02.2021


Ответы (1)


Попробуй это:

options.inJustDecodeBounds = true;
options.inScaled = false;
options.inDensity = 0;
options.inMutable = true; //API 11. Pass to canvas? Might crash without this.
//Load the image here... BitmapFactory.decodeResource()...

... //Some calculations.

options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
person Darkman    schedule 09.02.2021