1

ライブ壁紙の学習を始めたばかりで、この小さなものを作りました。

問題は、私のアプリが問題なくコンパイルされることです。

電話で開くと、プレビューに壁紙が表示されますが、「壁紙として設定」をクリックすると、何らかの理由でクラッシュし、フロント画面に戻り、壁紙が黒くなりますが、実行されません。

私の推測では、問題は 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/Surface(478): バッファのデキュー エラー (不明なエラー: -19) 07-06 17:14:43.869: E/Surface(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: E /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(Strips.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/dalvikvm(478): threadid=15: キャッチされない例外で終了するスレッド (group=0x4001b188) 07-06 17:14:43.979: E/AndroidRuntime(478): キャッチされないハンドラー: スレッドキャッチされていない例外 07-06 17:14:43.990: E/AndroidRuntime(478): java.lang.NullPointerException 07-06 17:14:43.990: E/AndroidRuntime(478): at 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): threadid=7: シグナル 3 07-06 に反応しています 17:14:43.999: E/dalvikvm(478): スタック トレース ファイル '/data/anr/traces.txt を開けません': アクセス拒否Strips$StripsEngine.run(Strips.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/dalvikvm(478): threadid=15: キャッチされない例外で終了するスレッド (group=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): threadid=7: シグナル 3 07-06 17:14:43.999 に反応しています: E/dalvikvm(478): スタック トレース ファイル '/data/anr/traces.txt' を開けません: 許可が拒否されましたStrips$StripsEngine.run(Strips.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/dalvikvm(478): threadid=15: キャッチされない例外で終了するスレッド (group=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): threadid=7: シグナル 3 07-06 17:14:43.999 に反応しています: E/dalvikvm(478): スタック トレース ファイル '/data/anr/traces.txt' を開けません: 許可が拒否されました81) 07-06 17:14:43.869: E/BaseSurfaceHolder(478): java.lang.Thread.run(Thread.java:1096) 07-06 17:14:43.972: W/dalvikvm(478): スレッド ID =15: キャッチされない例外で終了するスレッド (group=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): threadid=7: に反応シグナル 3 07-06 17:14:43.999: E/dalvikvm(478): スタック トレース ファイル '/data/anr/traces.txt' を開けません: 許可が拒否されました81) 07-06 17:14:43.869: E/BaseSurfaceHolder(478): java.lang.Thread.run(Thread.java:1096) 07-06 17:14:43.972: W/dalvikvm(478): スレッド ID =15: キャッチされない例外で終了するスレッド (group=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): threadid=7: に反応シグナル 3 07-06 17:14:43.999: E/dalvikvm(478): スタック トレース ファイル '/data/anr/traces.txt' を開けません: 許可が拒否されましたjava:1096) 07-06 17:14:43.972: W/dalvikvm(478): threadid=15: キャッチされない例外で終了するスレッド (group=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): at 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): threadid=7: シグナル 3 07-06 17:14:43.999: E/dalvikvm(478): スタック トレース ファイル '/data/anr を開けません/traces.txt': 権限が拒否されましたjava:1096) 07-06 17:14:43.972: W/dalvikvm(478): threadid=15: キャッチされない例外で終了するスレッド (group=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): at 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): threadid=7: シグナル 3 07-06 17:14:43.999: E/dalvikvm(478): スタック トレース ファイル '/data/anr を開けません/traces.txt': 権限が拒否されましたキャッチされていないハンドラー: キャッチされていない例外が原因で終了するスレッド スレッド 8 07-06 17:14:43.990: E/AndroidRuntime(478): java.lang.NullPointerException 07-06 17:14:43.990: E/AndroidRuntime(478): at 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): threadid=7: シグナル 3 07-06 17:14:43.999: E/dalvikvm(478): スタック トレース ファイル '/data/anr を開けません/traces.txt': 権限が拒否されましたキャッチされていないハンドラー: キャッチされていない例外が原因で終了するスレッド スレッド 8 07-06 17:14:43.990: E/AndroidRuntime(478): java.lang.NullPointerException 07-06 17:14:43.990: E/AndroidRuntime(478): at 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): threadid=7: シグナル 3 07-06 17:14:43.999: E/dalvikvm(478): スタック トレース ファイル '/data/anr を開けません/traces.txt': 権限が拒否されましたrun(Thread.java:1096) 07-06 17:14:43.999: I/dalvikvm(478): threadid=7: シグナル 3 に反応しています 07-06 17:14:43.999: E/dalvikvm(478): できませんスタック トレース ファイル '/data/anr/traces.txt' を開く: 許可が拒否されましたrun(Thread.java:1096) 07-06 17:14:43.999: I/dalvikvm(478): threadid=7: シグナル 3 に反応しています 07-06 17:14:43.999: E/dalvikvm(478): できませんスタック トレース ファイル '/data/anr/traces.txt' を開く: 許可が拒否されました

4

2 に答える 2

1

おそらく、リクエストしているキャンバスがholder.lockCanvas()まだ利用できないため、null になり、NullPointerException が発生します。

のドキュメントを参照してくださいlockCanvas()

返された Canvas を使用して、サーフェスのビットマップに描画できます。サーフェスが作成されていないか、編集できない場合は null が返されます。通常、Surface がいつ使用可能になるかを確認するには、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.

その時点でキャンバスは null であってはなりません。しかし、私はこれを見つけました.Androidのバグのようです:

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

したがって、おそらくこのアプローチを試す必要がありますCallback.surfaceCreated。または、他に何も機能しない場合は、投稿者 (投稿を削除した人) のようなタイムアウトを試してください。

于 2012-07-06T17:27:03.853 に答える
0

答えが出ました!

私は立方体のライブ壁紙のサンプルを見て、構造をコピーしました。コードは次のとおりです。

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

}

}
于 2012-07-06T18:30:05.163 に答える