Android LiveWallpaper 选择器崩溃

标签 android classcastexception live-wallpaper

我正在尝试为 Android 创建我自己的动态壁纸。我有一个编译和打开设置 Activity 的启动项目。但是在单击选择壁纸选择器的按钮后崩溃并出现以下异常:

FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:299)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
    at java.lang.Thread.run(Thread.java:838)
Caused by: java.lang.ClassCastException: android.graphics.drawable.LayerDrawable cannot be cast to android.graphics.drawable.BitmapDrawable
    at com.android.wallpaper.livepicker.LiveWallpaperListAdapter$LiveWallpaperEnumerator.doInBackground(LiveWallpaperListAdapter.java:226)
    at com.android.wallpaper.livepicker.LiveWallpaperListAdapter$LiveWallpaperEnumerator.doInBackground(LiveWallpaperListAdapter.java:149)
    at android.os.AsyncTask$2.call(AsyncTask.java:287)
    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
    at java.lang.Thread.run(Thread.java:838) 

如果从手机设置中打开墙纸选择器,它也会出现。 我的墙纸可能是错误的原因吗?如何?我目前不使用任何可绘制对象。

已添加

打开壁纸选择器的代码:

Intent intent = new Intent(WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER);
intent.putExtra(WallpaperManager.WALLPAPER_PREVIEW_META_DATA,
                new ComponentName(SettingsActivity.this, MyWallpaperService.class));
startActivity(intent);

MyWallpaperService类代码:

public class MyWallpaperService extends WallpaperService {

    @Override
    public Engine onCreateEngine() {
        return new MyEngine();
    }

    private class MyEngine extends Engine {
        private boolean visible;
        private Handler handler;
        private Runnable drawRunner = new Runnable() {
            @Override
            public void run() {
                draw();
            }
        };
        private int width;
        private int height;
        private BallsContainer balls;

        public MyEngine() {
            balls = new BallsContainer();
        }

        @Override
        public void onVisibilityChanged(boolean visible) {
          this.visible = visible;
          if (visible) {
            handler.post(drawRunner);
          } else {
            handler.removeCallbacks(drawRunner);
          }
        }

        @Override
        public void onSurfaceDestroyed(SurfaceHolder holder) {
          super.onSurfaceDestroyed(holder);
          this.visible = false;
          handler.removeCallbacks(drawRunner);
        }

        @Override
        public void onSurfaceChanged(SurfaceHolder holder, int format,
            int width, int height) {
          this.width = width;
          this.height = height;
          super.onSurfaceChanged(holder, format, width, height);
        }

        private void draw() {
            SurfaceHolder holder = getSurfaceHolder();
            Canvas canvas = null;
            try {
              canvas = holder.lockCanvas();
              if (canvas != null) {
                  balls.Draw(canvas, width, height);
              }
            } finally {
              if (canvas != null)
                holder.unlockCanvasAndPost(canvas);
            }
            handler.removeCallbacks(drawRunner);
            if (visible) {
              handler.postDelayed(drawRunner, 100);
            }
          }
    }
}

又加了一次

BallsContainer绘制方法:

public void Draw(Canvas canvas, int width, int height) {
    Iterator<Ball> iter = balls.iterator();
    while(iter.hasNext()) {
        Ball b = iter.next();
        b.Move(width, height);
        b.Draw(canvas);
    }
}

Ball绘制方法:

public void Draw(Canvas canvas) {
    canvas.drawCircle(pos.x, pos.y, radius, paint );
}

最佳答案

AsyncTaskdoInBackground() 抛出 ClassCastException 因为它试图将 LayerDrawable 转换为 BitmapDrawable 。提供可以安全地转换为 BitmapDrawable 的 Drawable 实例。

关于Android LiveWallpaper 选择器崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35465187/

相关文章:

android - 在 WebView 完全膨胀之前发生的媒体查询

android - java.lang.ClassCastException : android. os.BinderProxy 无法转换为 LocalBinder

引用 Firebase 时抛出 Java java.lang.ClassCastException

android - 在 Android 上将视频设置为墙纸

android - 动态壁纸作为应用程序背景

java - 从我的 Android 应用程序链接到 Facebook 应用程序中的页面

android - 根据ImageSlider更改按钮文本颜色

java - SerializationProxy 模式给出 ClassCastException : How to avoid?

java - 如何使用 Libgdx 在 LiveWallpaper 中使用 Oreo 的 WallpaperColors API?

java - 在Eclipse上将android库导入到JAVA项目中