0

Google Play를 추가하고 Play 스토어에서 내 앱을 출시하는 데 많은 어려움을 겪었습니다. 내가 스크린 클래스를 구현하여 LibGDX에서 만들었다는 것입니다. 갑자기 Google 가이드가 layout.xml을 만들고 내 앱에 새로운 것을 추가하여 바보 같은 "로그인"버튼을 만듭니까요. .LibGDX 및 GoogleApiClient 설정/통합 (처음)

나는 이제 40 시간 이상 동안 모든 곳에서 읽고/연구했습니다! 그리고 나는 정말로 더 가까운 바리캉이 아니다! 나는 지금 열정으로 구글을 싫어한다 (나는 다른 날까지 지지자였다!).이 문제에 관한 그들의 "문서화"는 두뇌 통증이고 LibGDX 프로젝트를 따르기가 거의 불가능하며 슬프게도 도움이되지 않는다. LibGDX 커뮤니티 포럼에서 사용

이것은 어렵지 않습니다. 나는 분명히 간단한 것을 놓쳤습니다! 나는 GoogleApiClient와 내 자신의 인터페이스가 제대로 설정되어 있다고 믿습니다. 오류없이 현재 필요한 모든 클래스 안에 GoogleApiClient의 인스턴스가 있습니다.

어리석은 레이아웃을 만들어 내 앱의 시작 부분에이 오류가 발생하면 (플레이어가 클릭하면 Sign In 버튼이있는 간단한 layout.xml을 만들려고했습니다. 로그인하면 앱이 평소와 같이 LibGDX Android 실행기에서 "초기화 ..."를 호출하여 시작할 것입니다.

현재이 오류가 발생합니다. :

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.megabro.flappyturd, PID: 3799 
        java.lang.RuntimeException: Unable to resume activity {com.megabro.flappyturd/com.megabro.flappyturd.AndroidLauncher}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.badlogic.gdx.backends.android.AndroidInput.onResume()' on a null object reference 
         at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3400) 
         at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2713) 
         at android.app.ActivityThread.-wrap12(ActivityThread.java) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:154) 
         at android.app.ActivityThread.main(ActivityThread.java:6077) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.badlogic.gdx.backends.android.AndroidInput.onResume()' on a null object reference 
         at com.badlogic.gdx.backends.android.AndroidApplication.onResume(AndroidApplication.java:299) 
         at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1269) 
         at android.app.Activity.performResume(Activity.java:6766) 
         at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3377) 
         at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440)  
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2713)  
         at android.app.ActivityThread.-wrap12(ActivityThread.java)  
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)  
         at android.os.Handler.dispatchMessage(Handler.java:102)  
         at android.os.Looper.loop(Looper.java:154)  
         at android.app.ActivityThread.main(ActivityThread.java:6077)  
         at java.lang.reflect.Method.invoke(Native Method)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)  

나는 페이스트 빈에 문제를 일으키는 전체 코드를 게시하도록하겠습니다, 여기에 링크를 넣어 것입니다 :

http://pastebin.com/F6sqQPDc

+0

링크를 게시하는 것을 잊었습니까? – lealceldeiro

+0

GoogleApiClient를 사용하기위한 필수 조건은 무엇입니까? 리더 보드와 업적을위한 것입니까? – Aryan

+0

안녕 친구, 예 Play 스토어에서 내 게임 중 하나 (첫 번째 타이머!)를 게시하려고했는데 개발자 콘솔 계정 등이 있습니다. 게임에 적어도 5 가지의 성격이 있어야한다고 말합니다. 나는 그들에게 모두 점수를 매겼다 (일관된 재 시합자를위한 마지막 점수는 제외). 그래서 필요한 것은 Games.unlockachievement() 메소드입니다. 하지만 goolge 가이드가 내 앱을 게시하기 위해 포함시켜야한다고 말하는 "로그인"버튼에 붙어있는 것처럼 보입니다. –

답변

2

잘하면 Intellij 또는 Android Studio를 사용하고 있습니다.

는 경우 예 프로젝트

https://github.com/libgdx/libgdx/wiki/Google-Play-Game-Services-in-LibGDX#intellij-and-android-studio-setup

public class MainActivity extends AndroidApplication implements GameHelperListener, ActionResolver { 
    private GameHelper gameHelper; 

    @Override 
    public void onCreate (Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     initialize(new TutorialLibgdxGameservices(this), false); 
    if (gameHelper == null) { 
     gameHelper = new GameHelper(this, GameHelper.CLIENT_GAMES); 
     gameHelper.enableDebugLog(true); 
    } 
    gameHelper.setup(this); 
    } 

    @Override 
    public void onStart(){ 
     super.onStart(); 
     gameHelper.onStart(this); 
    } 

    @Override 
    public void onStop(){ 
     super.onStop(); 
     gameHelper.onStop(); 
    } 

    @Override 
    public void onActivityResult(int request, int response, Intent data) { 
     super.onActivityResult(request, response, data); 
     gameHelper.onActivityResult(request, response, data); 
    } 

    @Override 
    public boolean getSignedInGPGS() { 
     return gameHelper.isSignedIn(); 
    } 

    @Override 
    public void loginGPGS() { 
     try { 
      runOnUiThread(new Runnable(){ 
       public void run() { 
        gameHelper.beginUserInitiatedSignIn(); 
       } 
      }); 
     } catch (final Exception ex) { 
     } 
    } 

    @Override 
    public void submitScoreGPGS(int score) { 
     Games.Leaderboards.submitScore(gameHelper.getApiClient(), "CgkI6574wJUXEAIQBw", score); 
    } 

    @Override 
    public void unlockAchievementGPGS(String achievementId) { 
     Games.Achievements.unlock(gameHelper.getApiClient(), achievementId); 
    } 

    @Override 
    public void getLeaderboardGPGS() { 
     if (gameHelper.isSignedIn()) { 
     startActivityForResult(Games.Leaderboards.getLeaderboardIntent(gameHelper.getApiClient(), "CgkI6574wJUXEAIQBw"), 100); 
     } 
     else if (!gameHelper.isConnecting()) { 
     loginGPGS(); 
     } 
    } 

    @Override 
    public void getAchievementsGPGS() { 
     if (gameHelper.isSignedIn()) { 
     startActivityForResult(Games.Achievements.getAchievementsIntent(gameHelper.getApiClient()), 101); 
     } 
     else if (!gameHelper.isConnecting()) { 
     loginGPGS(); 
     } 
    } 

    @Override 
    public void onSignInFailed() { 
    } 

    @Override 
    public void onSignInSucceeded() { 
    } 
} 

에 BaseGameUtils 통합 및 인터페이스를위한 핵심 모듈에 ActionResolver을 유지한다.

public interface ActionResolver { 
    public boolean getSignedInGPGS(); 
    public void loginGPGS(); 
    public void submitScoreGPGS(int score); 
    public void unlockAchievementGPGS(String achievementId); 
    public void getLeaderboardGPGS(); 
    public void getAchievementsGPGS(); 
} 
+0

안녕 다시 Abhishek. 신속한 답변에 감사드립니다. Android Studio를 사용 중이며 Google 페이지에서 제안한대로 BaseGameUtils 폴더를 프로젝트에 복사했습니다.레이아웃 /보기 (AndroidLauncher 내부)에서 내 코드를 모두 주석 처리하면 (예 : 아무런 그라데이션 사용하지 않아도) 코드가 작동한다고 확신합니다. 이제 코드를 읽고이 내용을 프로젝트에 적용하려고합니다. 친절한 도움을 주셔서 대단히 감사드립니다. 나는 최대한 빨리 돌아와서 앱에서 작동하는지 알려주지. (추신 : 귀하의 게시물에 투표를 시도했으나 여기서 새로운 것에 기인하여 할 수 없었습니다). 곧 돌아와,이 바로 시험해보십시오! –

+0

앱이나 코드에 문제가있는 경우 ping을 수행하십시오. – Aryan

+0

안녕하세요. 다시 친구. 내 첫 번째 질문은 "ActionResolver" "내 GoogInterface 내 코드와 동일한 인터페이스?) 및 어떤 ActionResolver 메서드가 있어야합니다 및 b) ActionResolver (즉, 안드로이드/코어/데스크톱 - 안드로이드 스튜디오) –