Android LiveWallpaper选择器崩溃

时间:2016-02-17 18:50:23

标签: android classcastexception live-wallpaper

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

connect()

如果从手机设置打开壁纸选择器也会出现。 我的壁纸可以成为错误的原因吗?如何?我现在不使用任何可绘制的。

打开壁纸选择器的代码:

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

2 个答案:

答案 0 :(得分:1)

AsyncTask的{​​{1}}引发doInBackground(),因为它试图将ClassCastException投放到LayerDrawable。提供可以安全地转换为BitmapDrawable的Drawable实例。

答案 1 :(得分:0)

Phillips支持的唯一建议是重置工厂。我做到了 - 没有更多的崩溃。我不喜欢这个解决方案,但它确实有用,而且我没有更好的解决方案。