getDrawable() 内存不足错误

Out of memory error on getDrawable()

我想将当前图像设置为 Android 设备中的墙纸,并在缩放后将其设置为我列表中的图像视图。我在做什么:

final WallpaperManager wm = WallpaperManager.getInstance(this);
final Drawable wallpaperDrawable = wm.getDrawable();
Bitmap bitmap = drawableToBitmap(wallpaperDrawable);
imageview.setImageBitmap(bitmap);

drawableToBitmap函数如下:

public static Bitmap drawableToBitmap (Drawable drawable) {
    if (drawable instanceof BitmapDrawable) {
        return ((BitmapDrawable)drawable).getBitmap();
    }

    int width = drawable.getIntrinsicWidth();
    width = width > 0 ? width : 1;
    int height = drawable.getIntrinsicHeight();
    height = height > 0 ? height : 1;

    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);

    return bitmap;
}

但是我收到这个错误:

01-29 13:30:50.150: E/dalvikvm-heap(3281): Out of memory on a 3891216-byte allocation.
    01-29 13:30:50.160: I/dalvikvm(3281): "main" prio=5 tid=1 RUNNABLE
    01-29 13:30:50.160: I/dalvikvm(3281):   | group="main" sCount=0 dsCount=0 obj=0x409c0460 self=0x12810
    01-29 13:30:50.170: I/dalvikvm(3281):   | sysTid=3281 nice=0 sched=0/0 cgrp=default handle=1074082952
    01-29 13:30:50.180: I/dalvikvm(3281):   | schedstat=( 1725234737 955825527 142 ) utm=152 stm=20 core=0
    01-29 13:30:50.190: I/dalvikvm(3281):   at android.graphics.Bitmap.nativeCreate(Native Method)
    01-29 13:30:50.190: I/dalvikvm(3281):   at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
    01-29 13:30:50.190: I/dalvikvm(3281):   at android.graphics.Bitmap.createBitmap(Bitmap.java:585)
    01-29 13:30:50.190: I/dalvikvm(3281):   at android.app.WallpaperManager.generateBitmap(WallpaperManager.java:729)
    01-29 13:30:50.190: I/dalvikvm(3281):   at android.app.WallpaperManager$Globals.getCurrentWallpaperLocked(WallpaperManager.java:265)
    01-29 13:30:50.200: I/dalvikvm(3281):   at android.app.WallpaperManager$Globals.peekWallpaperBitmap(WallpaperManager.java:230)
    01-29 13:30:50.200: I/dalvikvm(3281):   at android.app.WallpaperManager.getDrawable(WallpaperManager.java:350)
    01-29 13:30:50.210: I/dalvikvm(3281):   at storeapps.com.profilechanger.ListActivity.onCreate(ListActivity.java:64)
    01-29 13:30:50.210: I/dalvikvm(3281):   at android.app.Activity.performCreate(Activity.java:4466)
    01-29 13:30:50.220: I/dalvikvm(3281):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    01-29 13:30:50.220: I/dalvikvm(3281):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
    01-29 13:30:50.220: I/dalvikvm(3281):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
    01-29 13:30:50.220: I/dalvikvm(3281):   at android.app.ActivityThread.access0(ActivityThread.java:123)
    01-29 13:30:50.220: I/dalvikvm(3281):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
    01-29 13:30:50.220: I/dalvikvm(3281):   at android.os.Handler.dispatchMessage(Handler.java:99)
    01-29 13:30:50.220: I/dalvikvm(3281):   at android.os.Looper.loop(Looper.java:137)
    01-29 13:30:50.230: I/dalvikvm(3281):   at android.app.ActivityThread.main(ActivityThread.java:4424)
    01-29 13:30:50.230: I/dalvikvm(3281):   at java.lang.reflect.Method.invokeNative(Native Method)
    01-29 13:30:50.230: I/dalvikvm(3281):   at java.lang.reflect.Method.invoke(Method.java:511)
    01-29 13:30:50.230: I/dalvikvm(3281):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    01-29 13:30:50.230: I/dalvikvm(3281):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    01-29 13:30:50.230: I/dalvikvm(3281):   at dalvik.system.NativeStart.main(Native Method)
    01-29 13:30:50.270: I/Process(570): Sending signal. PID: 3281 SIG: 3
    01-29 13:30:50.270: I/dalvikvm(3281): threadid=3: reacting to signal 3
    01-29 13:30:50.310: W/WallpaperManager(3281): Can't generate default bitmap
    01-29 13:30:50.310: W/WallpaperManager(3281): java.lang.OutOfMemoryError
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.graphics.Bitmap.nativeCreate(Native Method)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.graphics.Bitmap.createBitmap(Bitmap.java:585)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.app.WallpaperManager.generateBitmap(WallpaperManager.java:729)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.app.WallpaperManager$Globals.getCurrentWallpaperLocked(WallpaperManager.java:265)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.app.WallpaperManager$Globals.peekWallpaperBitmap(WallpaperManager.java:230)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.app.WallpaperManager.getDrawable(WallpaperManager.java:350)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at storeapps.com.profilechanger.ListActivity.onCreate(ListActivity.java:64)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.app.Activity.performCreate(Activity.java:4466)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.app.ActivityThread.access0(ActivityThread.java:123)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.os.Handler.dispatchMessage(Handler.java:99)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.os.Looper.loop(Looper.java:137)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at android.app.ActivityThread.main(ActivityThread.java:4424)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at java.lang.reflect.Method.invokeNative(Native Method)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at java.lang.reflect.Method.invoke(Method.java:511)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    01-29 13:30:50.310: W/WallpaperManager(3281):   at dalvik.system.NativeStart.main(Native Method)
    01-29 13:30:50.310: D/ProfileChangerApp(3281):  wallpaper manager is :android.app.WallpaperManager@41085b88
    01-29 13:30:50.320: D/ProfileChangerApp(3281): image is not null
    01-29 13:30:50.320: I/dalvikvm(3281): Wrote stack traces to '/data/anr/traces.txt'
    01-29 13:30:50.340: D/AndroidRuntime(3281): Shutting down VM
    01-29 13:30:50.371: W/dalvikvm(3281): threadid=1: thread exiting with uncaught exception (group=0x409bf1f8)
    01-29 13:30:50.430: E/AndroidRuntime(3281): FATAL EXCEPTION: main
    01-29 13:30:50.430: E/AndroidRuntime(3281): java.lang.RuntimeException: Unable to start activity ComponentInfo{storeapps.com.profilechanger/storeapps.com.profilechanger.ListActivity}: java.lang.NullPointerException
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at android.app.ActivityThread.access0(ActivityThread.java:123)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at android.os.Handler.dispatchMessage(Handler.java:99)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at android.os.Looper.loop(Looper.java:137)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at android.app.ActivityThread.main(ActivityThread.java:4424)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at java.lang.reflect.Method.invokeNative(Native Method)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at java.lang.reflect.Method.invoke(Method.java:511)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at dalvik.system.NativeStart.main(Native Method)
    01-29 13:30:50.430: E/AndroidRuntime(3281): Caused by: java.lang.NullPointerException
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at storeapps.com.profilechanger.ListActivity.onCreate(ListActivity.java:70)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at android.app.Activity.performCreate(Activity.java:4466)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
    01-29 13:30:50.430: E/AndroidRuntime(3281):     ... 11 more

请帮帮我!

android:largeHeap="true" 在您的清单应用程序标签中

调整图片大小位图

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

上一行将从 Drawable 得到 Bitmap。除了添加上述行以从 Drawable.

获取 Bitmap 之外,无需执行任何操作
int height = (bitmap.getHeight() * 512 / bitmap.getWidth());
Bitmap scale = Bitmap.createScaledBitmap(bitmap, 512, height, true);
imageView.setImageBitmap(scale);

你的 Logcat 投了多少

01-29 13:30:50.310: W/WallpaperManager(3281): java.lang.OutOfMemoryError

当使用可用平台资源无法满足内存请求时抛出。 运行 应用程序或 VM 或 Device 的内部函数都可以发出此类请求。

  1. 在设置为 ImageView 之前压缩图像

Creates a new bitmap, scaled from an existing bitmap, when possible. If the specified width and height are the same as the current width and height of the source bitmap, the source bitmap is returned and no new bitmap is created.

Bitmap.createScaledBitmap(YourImageBitMap, 100, 50, true);
  1. 减小图片大小 .

您可以阅读 How to deal with the OutOfMemoryError &

Strange out of memory issue while loading an image to a Bitmap object

Drawable wallpaper = getApplicationContext().getWallpaper();

wallpaper是参考。

Bitmap.createBitmap 可能会出现 OOM 异常。

WindowManager源代码:

// This is the final bitmap we want to return.
try {
Bitmap newbm = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);

不要将非矢量可绘制对象放入 DRAWABLE,而是放入 DRAWABLE-NODPI。否则在某些设备上你将获得 OOME,因为它们被缩放并且具有更高的内存使用率。发生在三星更多