さて、私は絶対に私を困惑させている質問があります。ライブ壁紙があります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}