2016-02-17 8 views
4

Я пытаюсь создать свою собственную livewallpaper для Android. У меня есть начальный проект, который компилирует и открывает настройки Activity. Но после того, как кнопка для выбора обоев початкоотделяющих аварий нажав и появляется следующим исключением:Сбой в сборе Android LiveWallpaper

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); 
} 
+0

@ cricket_007 'LiveWallpaperListAdapter' не мой класс - это андроиды. – Ircover

+0

А теперь посмотри. Тем не менее, пожалуйста, добавьте какой-либо код в ваш AsyncTask –

+0

@ cricket_007 У меня нет 'AsyncTask's' - это все внутри обоев для андроидов. – Ircover

ответ

0

Единственный совет поддержки Phillips - произвести сброс настроек. Я сделал это - больше нет крушения. Мне не нравится это решение, но оно работает, и у меня нет лучшего.

1

AsyncTask «s doInBackground() бросает ClassCastException, потому что пытаются бросить LayerDrawable в BitmapDrawable. Предоставьте экземпляр Drawable, который можно безопасно преобразовать в BitmapDrawable.