Android:BitmapFactory.decodeResource返回null

时间:2011-09-21 14:49:14

标签: android graphics bitmap android-context

我似乎无法弄清楚这一点。我有2个具有不同特征的java类,每个类都调用BitmapFactory.decodeResource来获取相同的图像资源,一个返回位图而另一个返回null。两个类都在同一个包中。

这是可行的类,它调用BitmapFactory.decodeResource返回位图。我只提供了相关的代码。

package advoworks.test;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MainScreen extends SurfaceView implements SurfaceHolder.Callback {

    private static final String TAG = MainScreen.class.getSimpleName();

    public MainScreen(Context context) {
        super(context);

        Bitmap bitmap;
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.droid_1);

        //adding the callback (this) to the surface holder to intercept events;
        getHolder().addCallback(this);

        // make the GamePanel focusable so it can handle events
        setFocusable(true);

    }
}

这是不起作用的课程。 BitmapFactory.decodeResource在调试中返回NULL。我只包括我觉得相关的代码。

package advoworks.test;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.Log;

public class Segment {

    private int x;
    private int y;
    private Bitmap bitmap;

    public Segment(int x, int y) {
        Log.d(TAG, "Creating Segment");
        try {
            this.bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.droid_1);
        } catch (Exception e) {
            Log.d(TAG,"Error is " + e);
        }   
        this.x = x;
        this.y = y;
        Log.d(TAG, "Created Segment");
    }
}

有人知道吗?

4 个答案:

答案 0 :(得分:6)

检查图像的分辨率,如果它太大,BitmapFactory.decodeResource将只返回null(无异常)

答案 1 :(得分:4)

getResources()Context类方法,您没有在Segment类中使用上下文。它是如何工作的。你应该致电getApplicationContext().getResources()

您应该将上下文传递给Segment构造函数。

public Segment(Context context, int x, int y) {
    ....
    bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.droid_1);
    ....
}

答案 2 :(得分:1)

确保您的图片不在 drawable-v24 文件夹中,然后将其移动到 drawable 文件夹中。

这对我有用。

答案 3 :(得分:1)

我的解决方案是创建一个可绘制对象(创建该对象没有问题),然后将其转换为位图

val drawable = context.getDrawable(context.resources, R.drawable.droid_1)
val bitmap = drawable.toBitmap(width = 100, height = 100, config = null)

您还可以使用drawable.widthdrawable.height来具有相同的比例和分辨率