android - ImageView.getDrawingCache() 在 Android 4.4.4 及以下版本上为 null

标签 android

我正在尝试从 Imageview 设置设备壁纸。我的代码在运行 Android 5.0 及更高版本的设备上完美运行,但由于某种原因,它不适用于 4.4.4 或更低版本。

我正在通过菜单项设置墙纸。这是代码:

else if (id == R.id.action_quick_set) {

    wallpaper_img_menu = (ImageView) findViewById(R.id.wallpaper_image);

    wallpaper_img_menu.setDrawingCacheEnabled(true);

    // this is the important code :)
    // Without it the view will have a dimension of 0,0 and the bitmap will be null
    wallpaper_img_menu.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    wallpaper_img_menu.layout(0, 0,
                wallpaper_img_menu.getMeasuredWidth(),
                wallpaper_img_menu.getMeasuredHeight());

    wallpaper_img_menu.buildDrawingCache(true);
    // This is what's null (line 807); everything else works fine
    Bitmap b = Bitmap.createBitmap(wallpaper_img_menu.getDrawingCache());
    wallpaper_img_menu.setDrawingCacheEnabled(false); // clear drawing cache

    try {
        WallpaperManager.getInstance(getBaseContext()).setBitmap(b);
        Toast.makeText(getBaseContext(), "Done!", Toast.LENGTH_SHORT).show();
        finish();
    } catch (IOException | NullPointerException e) {
        e.printStackTrace();
    }

}

这是 logcat 输出:

08-29 19:34:57.025  25668-25668/com.hidden.hidden E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at android.graphics.Bitmap.createBitmap(Bitmap.java:505)
            at com.hidden.hidden.viewer.WallpaperViewer.onOptionsItemSelected(WallpaperViewer.java:807)
            at android.app.Activity.onMenuItemSelected(Activity.java:2566)
            at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:325)
            at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:147)
            at android.support.v7.internal.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:100)
            at android.support.v7.app.AppCompatDelegateImplV7.onMenuItemSelected(AppCompatDelegateImplV7.java:583)
            at android.support.v7.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811)
            at android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153)
            at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958)
            at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:948)
            at android.support.v7.internal.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java:191)
            at android.widget.AdapterView.performItemClick(AdapterView.java:298)
            at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
            at android.widget.AbsListView$PerformClick.run(AbsListView.java:2788)
            at android.widget.AbsListView$1.run(AbsListView.java:3463)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)

代码来自here.

我不明白的是为什么它适用于 Android 5.0 及更高版本但不适用于以下版本。

感谢帮助!

最佳答案

先获取Drawable:

Drawable d = wallpaper_img_menu.getDrawable();

然后在任何你喜欢的Canvas上绘制你的Drawable,确保你设置了边界(d.setBounds(...) ) 在调用 d.draw(canvas)

之前

关于android - ImageView.getDrawingCache() 在 Android 4.4.4 及以下版本上为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32291744/

相关文章:

android - 用phoneGap播放声音时出错

android - 如何在 IBM MobileFirst 混合应用程序中启用放大/缩小

java - 如何将 "Content-Type " header 的数据发布为 "multipart/form-data"

android - 如何让我的抽屉导航始终位于所有内容之上?安卓

android - 如何在 android 模拟器中安装 .apk 文件?

java - 插入到 HashMap 中会导致排序困惑

android - webView android 上的服务器挂断

android - 如何使用第一个 fragment 中的监听器将一个 fragment 替换为另一个 fragment

java - 如何在 Android 应用程序中运行终端命令?

android - 不同资源类型的可绘制状态表