Android动态壁纸不显示(Android Live wallpaper doesn't

2019-09-19 04:31发布

我刚开始学习动态壁纸和我做了这个小东西。

事情是我的应用程序有任何问题汇总。

正如我在电话中打开它它显示在预览墙纸但是当我点击“设置为墙纸”它在某种程度上崩溃,并返回前屏幕,和我的壁纸将变成黑色,但它不运行它。

我的猜测是,这个问题是沿onDestory一些地方()..

public class Strips extends WallpaperService {

private StripsEngine engine;

@Override
public void onCreate() {
    super.onCreate();
    engine = new StripsEngine();
    engine.resume();

}

@Override
public void onDestroy() {
    super.onDestroy();
    engine.pause();
}

@Override
public Engine onCreateEngine() {

    return engine;
}

class StripsEngine extends Engine implements Runnable {
    private Thread t = null;
    private SurfaceHolder holder;
    private boolean clearToRun = false;
    private Paint paint = new Paint();
    private Paint paint2 = new Paint();
    private int frame;
    private float endX,endY;
    private int height, width;
    private Canvas c;


    StripsEngine() {
        holder = getSurfaceHolder();
        paint.setColor(Color.WHITE);
        paint.setStrokeWidth(30);
        paint.setAntiAlias(true);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStyle(Paint.Style.STROKE);
        paint2 = paint;
        paint2.setColor(Color.BLACK);
        paint2.setStrokeWidth(40);
        frame = 0;
    }

    void drawStrips() {

    }

    public void run() {
        // TODO Auto-generated method stub
        while (clearToRun) {
            if (!holder.getSurface().isValid()) {
                continue;
            }
            height = 800;
            width = 480; 

            endX = (frame) % (width + 10);
            endY = (frame / 3) % (height + 10);

            if (endX == 0)
                paint.setARGB(255,(int)(Math.random()*255), (int)(Math.random()*255),(int)(Math.random()*255));
            if (endY ==0)
                paint.setARGB(255,(int)(Math.random()*255), (int)(Math.random()*255),(int)(Math.random()*255));


            c = holder.lockCanvas();
            c.drawLine(endX-30, endY-10, endX , endY,paint);
            c.drawLine(endX-30, endY-10, endX , endY,paint);
            holder.unlockCanvasAndPost(c);
            frame = frame +2;
            }
    }
    public void pause() {
        clearToRun = false;
        while (true) {
            try {
                t.join();
            }
            catch (InterruptedException e) {
                e.printStackTrace();    
            }
            break;
        }
        t = null;
    }

    public void resume() {
        clearToRun = true;
        t = new Thread(this);

        t.start();
    }
}

}

07-06 17:14:43.869:E /表面(478):错误出队缓冲器(未知的错误:-19)07-06 17:14:43.869:E /表面(478):dequeueBuffer失败(没有这样的设备) 07-06 17:14:43.869:E / BaseSurfaceHolder(478):异常锁定表面07-06 17:14:43.869:E / BaseSurfaceHolder(478):java.lang.IllegalArgumentException异常07-06 17:14:43.869:电子/ BaseSurfaceHolder(478):在android.view.Surface.lockCanvasNative(本机方法)07-06 17:14:43.869:E / BaseSurfaceHolder(478):在android.view.Surface.lockCanvas(Surface.java:288)07 -06 17:14:43.869:E / BaseSurfaceHolder(478):在com.android.internal.view.BaseSurfaceHolder.internalLockCanvas(BaseSurfaceHolder.java:132)07-06 17:14:43.869:E / BaseSurfaceHolder(478):在com.android.internal.view.BaseSurfaceHolder.lockCanvas(BaseSurfaceHolder.java:112)07-06 17:14:43.869:E / BaseSurfaceHolder(478):在com.mendel.strips.Strips $ StripsEngine.run(条。的java:81)07-06 17:14:43.869:E / BaseSurfaceHolder(478):在java.lang.Thread.run(Thread.java:1096)07-06 17:14:43.972:W / d alvikvm(478):线程ID = 15:用未捕获的异常线程退出(组= 0x4001b188)07-06 17:14:43.979:E / AndroidRuntime(478):未捕获的处理程序:螺纹螺纹-8离开由于未捕获的异常07-06 17:14:43.990:E / AndroidRuntime(478):显示java.lang.NullPointerException 07-06 17:14:43.990:E / AndroidRuntime(478):在com.mendel.strips.Strips $ StripsEngine.run(Strips.java :82)07-06 17:14:43.990:E / AndroidRuntime(478):在java.lang.Thread.run(Thread.java:1096)07-06 17:14:43.999:I / dalvikvm(478):主题ID = 7:反应以信号3月7日至6日17:14:43.999:E / dalvikvm(478):无法打开堆栈跟踪文件 '/data/anr/traces.txt':权限被拒绝

Answer 1:

这可能是因为您请求帆布holder.lockCanvas()还没有提供,所以它的空,你会得到一个NullPointerException。

请参阅的文件lockCanvas()

返回的画布可用于绘制表面的位图。 如果表面没有被创建或则返回空否则不能进行编辑。 您通常需要实现Callback.surfaceCreated找出当表面可供使用。

更新:

根据对isValid()的文档,你所收到主叫- Does this object hold a valid surface? Returns true if it holds a physical surface, so lockCanvas() will succeed. Otherwise returns false. Does this object hold a valid surface? Returns true if it holds a physical surface, so lockCanvas() will succeed. Otherwise returns false.

画布不应该在这一点空。 但我发现这一点,似乎是Android系统中的错误:

http://code.google.com/p/android/issues/detail?id=19245

所以,你可能要尝试一下Callback.surfaceCreated方法,或者,如果不出意外的作品,尝试像海报超时(谁删除的帖子),建议,但是这真的是你应该避免,因为它是不可靠的和凌乱。



Answer 2:

我得到了答案!

我已经通过立方体动态壁纸样品看起来和复制的结构,这里是代码:

public class Strips extends WallpaperService {

private final Handler mHandler = new Handler();   
@Override
public void onCreate() {
    super.onCreate();

}

@Override
public void onDestroy() {
    super.onDestroy();
}

@Override
public Engine onCreateEngine() {

    return new StripsEngine();
}

class StripsEngine extends Engine   {
    private Thread t = null;
;
    private boolean clearToRun = false;
    private Paint paint = new Paint();
    private Paint paint2 = new Paint();
    private int frame;
    private float endX,endY;
    private int height, width;
    private Canvas c;

    private final Runnable mDrawStrip = new Runnable() {
        public void run() {
            drawFrame();
        }
    };


    StripsEngine() {
        paint.setColor(Color.WHITE);
        paint.setStrokeWidth(30);
        paint.setAntiAlias(true);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStyle(Paint.Style.STROKE);
        paint2 = paint;
        paint2.setColor(Color.BLACK);
        paint2.setStrokeWidth(40);
        frame = 0;
    }

     @Override
        public void onDestroy() {
            super.onDestroy();
            mHandler.removeCallbacks(mDrawStrip);
        }

     @Override
        public void onSurfaceCreated(SurfaceHolder holder) {
            super.onSurfaceCreated(holder);
        }

     @Override
        public void onSurfaceDestroyed(SurfaceHolder holder) {
            super.onSurfaceDestroyed(holder);
            clearToRun = false;
            mHandler.removeCallbacks(mDrawStrip);
        }


     @Override
        public void onVisibilityChanged(boolean visible) {
            clearToRun = visible;
            if (visible) {
                drawFrame();
            } else {
                mHandler.removeCallbacks(mDrawStrip);
            }
        }


    public void drawFrame() {
        // TODO Auto-generated method stub
     final SurfaceHolder holder = getSurfaceHolder();
       Canvas c = null;
       try {
           c = holder.lockCanvas();
           if (c != null) {
               // draw something
            height = 800;
            width = 480; 

            endX = (frame) % (width + 10);
            endY = (frame / 3) % (height + 10);


            if (endX == 0)
                paint.setARGB(255,(int)(Math.random()*255), (int)(Math.random()*255),(int)(Math.random()*255));
            if (endY ==0)
                paint.setARGB(255,(int)(Math.random()*255), (int)(Math.random()*255),(int)(Math.random()*255));

            c.drawLine(endX-30, endY-10, endX , endY,paint);
            frame = frame +2;
           }
       } finally {
           if (c != null) holder.unlockCanvasAndPost(c);
       }
         mHandler.removeCallbacks(mDrawStrip);
            if (clearToRun) {
                mHandler.postDelayed(mDrawStrip, 1000 / 25);
            }
    }

}

}


文章来源: Android Live wallpaper doesn't show