1

さて、私は絶対に私を困惑させている質問があります。ライブ壁紙がありますhttps://play.google.com/store/apps/details?id=com.simpleworkerz.boise.sunsets#?t=W251bGwsMSwyLDIxMiwiY29tLnNpbXBsZXdvcmtlcnouYm9pc2Uuc3Vuc2V0cyJd

アプリには、ライブ壁紙とスライドショーの両方が含まれています。スライドショーバージョンはsamsungで問題なく動作します(ライブ壁紙とスライドショーの両方で同じopenglレンダラーが表示されますが、ユーザーがライブ壁紙にアクセスして[SET WALLPAPER]を選択すると、次のようになります。

1)設定した壁紙のテキストの色が変わります。(まだ何も開始されていないようですが)2)画面が再び真っ暗になり、「壁紙の読み込みが始まります」というメッセージが表示されます。3)3〜4秒後に何も表示されず、BoiseSunsetsが機能を停止して閉じる必要があるというメッセージが表示されます。または、[壁紙をもう一度設定]をクリックすると、強制終了します。

ユーザーが[壁紙の設定]をクリックする前にすべてが正常に機能するため、すべてが正常にレンダリングおよび表示されます。

したがって、私の問題はoncreateまたはonsurfaceの変更に関係していると思います。「壁紙を設定」ボタンをクリックしたときの正確な呼び方がよくわかりません。誰か知ってる?

これが壁紙の私のコードです。

import android.content.SharedPreferences;
import android.service.wallpaper.*;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGL11;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;
import javax.microedition.khronos.opengles.GL10;

 public class BoiseSunsetsLiveWallpaper extends WallpaperService{

@Override
public Engine onCreateEngine(){

    return new MyEngine();

}

class MyEngine extends Engine
{

    private float mTouchX = -1;
    private float mTouchY = -1;

    private GLRenderer glRenderer;
    private GL10 gl;
    private EGL10 egl;
    private EGLContext glc;
    private EGLDisplay glDisplay;
    private EGLSurface glSurface;

    private ExecutorService executor;
    private Runnable drawCommand;

@Override
    public void onCreate(final SurfaceHolder holder){
        super.onCreate(holder);

        executor = Executors.newSingleThreadExecutor();

        drawCommand = new Runnable(){
            public void run(){

                glRenderer.onDrawFrame(gl);
                egl.eglSwapBuffers(glDisplay, glSurface);
                if(isVisible()
                        && egl.eglGetError() != EGL11.EGL_CONTEXT_LOST 
                        && !executor.isShutdown()){
                    executor.execute(drawCommand);
                }
            }
        };

    }

    @Override
    public void onDestroy(){
        executor.shutdown();

        //setTouchEventsEnabled(false);
        //glRenderer.onSurfaceDestroyed();
        glRenderer = null;

        super.onDestroy();
    }

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


        Runnable surfaceCreatedCommand = new Runnable(){
            public void run(){

                //Initialize Open GL
                egl = (EGL10) EGLContext.getEGL();
                glDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
                int[] version = new int[2];
                egl.eglInitialize(glDisplay, version);
                int[] configSpec = {
                        EGL10.EGL_RED_SIZE, EGL10.EGL_DONT_CARE,
                        EGL10.EGL_GREEN_SIZE, EGL10.EGL_DONT_CARE,
                        EGL10.EGL_BLUE_SIZE, EGL10.EGL_DONT_CARE,
                        EGL10.EGL_DEPTH_SIZE, EGL10.EGL_DONT_CARE,
                        EGL10.EGL_NONE };

                EGLConfig[] configs = new EGLConfig[1];
                int[] numConfig = new int[1];
                egl.eglChooseConfig(glDisplay, configSpec, configs, 1, numConfig);
                EGLConfig config = configs[0];

                glc = egl.eglCreateContext(glDisplay, config, EGL10.EGL_NO_CONTEXT, null);

                glSurface = egl.eglCreateWindowSurface(glDisplay, config, holder, null);

                egl.eglMakeCurrent(glDisplay, glSurface, glSurface, glc);
                gl = (GL10) (glc.getGL());

                //Initialize Renderer
                glRenderer = new GLRenderer(BoiseSunsetsLiveWallpaper.this);
                glRenderer.onSurfaceCreated(gl, config);
                }
            };
            executor.execute(surfaceCreatedCommand);

    }

    @Override
    public void onSurfaceDestroyed(final SurfaceHolder holder){
        Runnable surfaceDestroyedCommand = new Runnable() {
            public void run(){
                //Free OpenGL resources
                egl.eglMakeCurrent(glDisplay, EGL10.EGL_NO_SURFACE, 
                        EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);
                egl.eglDestroySurface(glDisplay, glSurface);
                egl.eglDestroyContext(glDisplay, glc);
                egl.eglTerminate(glDisplay);
            }
        };
        executor.execute(surfaceDestroyedCommand);
        super.onSurfaceDestroyed(holder);
    }

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

        Runnable surfaceChangedCommand = new Runnable(){
            public void run(){
                glRenderer.onSurfaceChanged(gl, width, height);
            }
        };
        executor.execute(surfaceChangedCommand);
    }

    @Override
    public void onVisibilityChanged(final boolean visible){
        super.onVisibilityChanged(visible);

        if(visible){

            executor.execute(drawCommand);
        }
    }

    @Override
    public void onOffsetsChanged(final float xOffset, final float yOffset, final float xOffsetStep, final float yOffsetStep,
            final int xPixelOffset,final int yPixelOffset){
        super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);

        Runnable offsetsChangedCommand = new Runnable(){
            public void run(){
                if (xOffsetStep != 0f){
                    glRenderer.setParallax(xOffset - 0.5f);
                }
            }
        };
        executor.execute(offsetsChangedCommand);
    }

    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {


    }

    @Override
    public void onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
            mTouchX = event.getX();
            mTouchY = event.getY();
        } else {
            mTouchX = -1;
            mTouchY = -1;
        }

        Runnable TouchChangedCommand = new Runnable(){
            public void run(){
                if (mTouchX >=0 && mTouchY >= 0){

                    glRenderer.IsPressed(mTouchX, mTouchY);


                }
                else{


                }
            }
        };
        executor.execute(TouchChangedCommand);

        super.onTouchEvent(event);
    }

}

}

不思議なことに、壁紙の設定をクリックして画面をすばやく終了すると、壁紙が実際に機能することがあります。または、数秒後に閉じます。

私はVerizonとSprintの両方のストアでこれをテストしていたので、実際にはsamsung電話を所有していません。笑。だから私は特定のエラーを与えることはできません。私がサムスンのテスト電話を手に入れたら、私はそうします。それまで、私はあなたが集めることができるどんな洞察にも感謝します!

ライブ壁紙には、Hello、AndroidのEdBurnetteのコードの一部を使用しています。私の問題はこの問題に関連していると思いました。http://forums.pragprog.com/forums/152/topics/8254 しかし、私はそれらすべての変更を行いましたが、まだ問題が発生しています。

アップデート

/AndroidRuntime( 9520): FATAL EXCEPTION: pool-1-thread-1

E/AndroidRuntime( 9520): java.lang.NullPointerException

E/AndroidRuntime( 9520):    at com.simpleworkerz.boise.sunsets.BoiseSunsetsLiveWallpaper$MyEngine$1.run(BoiseSunsetsLiveWallpaper.java:55)

E/AndroidRuntime( 9520):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)

E/AndroidRuntime( 9520):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)

E/AndroidRuntime( 9520):    at java.lang.Thread.run(Thread.java:856)

D/KeyguardViewMediator(  651): setHidden false

D/KeyguardViewMediator(  651): setHidden false

I/WindowManager(  651): WIN DEATH: Window{423d0120 XXX.XXXXX.XXX.XXXXXXX/XXX.XXXXX.XXX.XXXXXXX.XXXXXXXX.XXXXXXXXXXXX paused=false}
4

0 に答える 0