it-swarm.com.de

Wird durch Java.lang.NullPointerException verursacht: Versuch, die virtuelle Methode 'int Android.graphics.Bitmap.getWidth ()' für eine Nullobjektreferenz aufzurufen

Ich habe BitmapScalingHelper.Java: 

public class BitmapScalingHelper
{
    public static Bitmap decodeResource(Resources res, int resId, int dstWidth, int dstHeight)
    {
        Options options = new Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resId, options);
        options.inJustDecodeBounds = false;

        options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, dstWidth,
                dstHeight);

        Bitmap unscaledBitmap = BitmapFactory.decodeResource(res, resId, options);

        return unscaledBitmap;
    }

    public static Bitmap decodeFile(String filePath, int dstWidth, int dstHeight)
    {
        Options options = new Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(filePath, options);

        options.inJustDecodeBounds = false;
        options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, dstWidth,
                dstHeight);

        Bitmap unscaledBitmap = BitmapFactory.decodeFile(filePath, options);

        return unscaledBitmap;
    }


    public static int calculateSampleSize(int srcWidth, int srcHeight, int dstWidth, int dstHeight)
    {
        final float srcAspect = (float)srcWidth / (float)srcHeight;
        final float dstAspect = (float)dstWidth / (float)dstHeight;

        if (srcAspect > dstAspect)
        {
            return srcWidth / dstWidth;
        }
        else
        {
            return srcHeight / dstHeight;
        }
    }

    public static Bitmap createScaledBitmap(Bitmap unscaledBitmap, int dstWidth, int dstHeight)
    {
        Rect srcRect = calculateSrcRect(unscaledBitmap.getWidth(), unscaledBitmap.getHeight());

        Rect dstRect = calculateDstRect(unscaledBitmap.getWidth(), unscaledBitmap.getHeight(),
                dstWidth, dstHeight);

        Bitmap scaledBitmap = Bitmap.createBitmap(dstRect.width(), dstRect.height(),
                Config.ARGB_8888);

        Canvas canvas = new Canvas(scaledBitmap);
        canvas.drawBitmap(unscaledBitmap, srcRect, dstRect, new Paint(Paint.FILTER_BITMAP_FLAG));

        return scaledBitmap;
    }

    public static Rect calculateSrcRect(int srcWidth, int srcHeight)
    {
        System.out.print("Scr" + srcWidth + " " + srcHeight);
        return new Rect(0, 0, srcWidth, srcHeight);
    }

    public static Rect calculateDstRect(int srcWidth, int srcHeight, int dstWidth, int dstHeight)
    {
        final float srcAspect = (float)srcWidth / (float)srcHeight;
        final float dstAspect = (float)dstWidth / (float)dstHeight;

        if (srcAspect > dstAspect)
        {
            return new Rect(0, 0, dstWidth, (int)(dstWidth / srcAspect));
        }
        else
        {
            return new Rect(0, 0, (int)(dstHeight * srcAspect), dstHeight);
        }
    }
}

In dieser Klasse gibt es:

createScaledBitmap()

... das ein skaliertes Bitmap-Bild zurückgibt.

In einer anderen Klasse habe ich folgende Methode:

public Bitmap readSelectedBitmapFromFile(Context context, String fileName)
    {
        DisplayMetrics metrics = new DisplayMetrics();
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        windowManager.getDefaultDisplay().getMetrics(metrics);

        Bitmap scaledBitmap = getDefaultBitmap(context);

        try {
            File themeParentDir = context.getDir(THEME_DIRECTORY_NAME, Context.MODE_PRIVATE); //Creating an internal dir;
            File themeSubDir = new File(themeParentDir, THEME_SUB_DIRECTORY_NAME + getThemeBasedDirectoryNumber(m_SelectedTheme));
            themeSubDir.mkdir();

            File themeFileWithinDir = new File(themeSubDir, fileName); //Getting a file within the dir.

            if(themeFileWithinDir.exists())
            {
                // Part 1: Decode image
                Bitmap unscaledBitmap = BitmapScalingHelper.decodeFile(themeFileWithinDir.getPath(), metrics.widthPixels, metrics.heightPixels);

                // Part 2: Scale image
                scaledBitmap = BitmapScalingHelper.createScaledBitmap(unscaledBitmap, metrics.widthPixels, metrics.heightPixels);
                unscaledBitmap.recycle();
            }

            m_SelectedBitmap = scaledBitmap;

        }
        catch (Error e) {
            e.printStackTrace();
        }

        return scaledBitmap;
    }

Dieser Code funktionierte in vielen Geräten einwandfrei. Bei einigen Geräten stürzte es jedoch ab. Kann mir einer bitte helfen?

Ich bekomme so ein Protokoll: 

Fatal Exception: Java.lang.RuntimeException: Unable to start activity ComponentInfo: Java.lang.NullPointerException: Attempt to invoke virtual method 'int Android.graphics.Bitmap.getWidth()' on a null object reference
       at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:3254)
       at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:3350)
       at Android.app.ActivityThread.access$1100(ActivityThread.Java:222)
       at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1795)
       at Android.os.Handler.dispatchMessage(Handler.Java:102)
       at Android.os.Looper.loop(Looper.Java:158)
       at Android.app.ActivityThread.main(ActivityThread.Java:7229)
       at Java.lang.reflect.Method.invoke(Method.Java)
       at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1230)
       at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1120)
Caused by Java.lang.NullPointerException: Attempt to invoke virtual method 'int Android.graphics.Bitmap.getWidth()' on a null object reference
       at in.plackal.lovecyclesfree.util.BitmapScalingHelper.createScaledBitmap(SourceFile:62)
       at in.plackal.lovecyclesfree.general.ThemeManager.readSelectedBitmapFromFile(SourceFile:202)
       at in.plackal.lovecyclesfree.activity.SplashActivity.onCreate(SourceFile:70)
       at Android.app.Activity.performCreate(Activity.Java:6876)
       at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1135)
       at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:3207)
       at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:3350)
       at Android.app.ActivityThread.access$1100(ActivityThread.Java:222)
       at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1795)
       at Android.os.Handler.dispatchMessage(Handler.Java:102)
       at Android.os.Looper.loop(Looper.Java:158)
       at Android.app.ActivityThread.main(ActivityThread.Java:7229)
       at Java.lang.reflect.Method.invoke(Method.Java)
       at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1230)
       at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1120)

Wenn es sich um ein Berechtigungsproblem handelt, sollte es nicht unter der Android-M-Version abstürzen, es stürzt jedoch auch bei einigen Pre-Android-M-Geräten ab.

13
Pavan Bilagi

Das Problem, mit dem Sie konfrontiert sind, besteht darin, dass Sie versuchen, getWidth() auf Ihrem unscaledBitmap in der createScaledBitmap-Funktion zu arbeiten. Natürlich ist Ihre unscaledBitmap manchmal null; und der Aufruf von getWidth() verursacht die Nullzeiger-Ausnahme.

Die Hauptursache ist, dass decodeResource Ihnen aus irgendeinem Grund eine Null zurückgibt.

Die Gründe können sein:

  1. Keine Leseberechtigung
  2. Die Bilddatei ist beschädigt
  3. Es ist nicht genügend Speicher vorhanden, um die Datei zu decodieren
  4. Die Ressource existiert nicht
  5. Ungültige Optionen in der Optionsvariablen angegeben.

Ich empfehle Ihnen, Ihren Code so zu ändern, dass er die dekodierte Bitmap auf Null überprüft, protokolliert und von dort aus auf den spezifischen Geräten debuggt, auf denen der Fehler auftritt.

Es kann auch sein, dass Ihre Optionsvariable, die Sie wiederverwenden, im zweiten Aufruf von decodeResource unterschiedlich interpretiert wird. Sie könnten versuchen, dort eine Null zu übergeben.

Der geänderte Code sollte wie folgt lauten:

public class BitmapScalingHelper
{
    public static Bitmap decodeResource(Resources res, int resId, int dstWidth, int dstHeight)
    {
        Options options = new Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resId, options);
        options.inJustDecodeBounds = false;

        options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, dstWidth,
                dstHeight);

        options = new Options(); 
        //May use null here as well. The funciton may interpret the pre-used options variable in ways hard to tell.
        Bitmap unscaledBitmap = BitmapFactory.decodeResource(res, resId, options);

        if(unscaledBitmap == null)
        {
            Log.e("ERR","Failed to decode resource - " + resId + " " + res.toString());
            return null;
        }

        return unscaledBitmap;
    }
}
6
neur0tic

Sie verwenden Folgendes: Bitmap decodeFile (String pathName) Diese Methode gibt möglicherweise Null zurück, wenn die Decodierung der Datei fehlschlägt .. __ Ich denke, dass dies mit einem Berechtigungsproblem auf einem Gerät oder mit einem nicht unterstützten Bildformat zusammenhängen kann GIF, probiere https://developer.Android.com/reference/Android/graphics/Movie.html

0
Anis BEN NSIR

Es gibt einige Gründe, die den Fehler verursachen können.

  1. Fehlende Berechtigung in AndroidManifest.xml. Lese- oder Schreibberechtigung.
  2. Die Datei ist nicht vorhanden oder Sie versuchen, auf eine Datei zuzugreifen, die nicht als Bitmap dekodiert werden kann.

Aus dem Code, den Sie posten, kann ich keine Logikfehler finden. Hier sind meine Vorschläge:

  1. Ändern Sie ein anderes Bild und testen Sie.

  2. Versuchen Sie, ImageLoader Library wie Glide oder Fresco zu verwenden, und testen Sie.

0
orzangleli