2013-04-23 34 views
2

我正在整合FaceBookLibgdx。一些FaceBook方法需要上下文(來自Android Activity)。我找到了一些資源來幫助我thisfacebook與Android上的libgdx集成

在我跟着本教程後,我有我的Interface,然後我創建了一個實現Interface的對象。 (該對象包含Context),並將該對象傳遞到Android項目的MainActivity中的初始化方法中。問題是我無法訪問我的主libgdx項目中的上下文,因爲它無法訪問android庫android.content.Context

請幫我解決這個問題,因爲它有必要有FaceBook登錄我的應用程序。

我已經瀏覽了大量關於此問題的問題,而沒有一個人有明確的答案。提前致謝。

//編輯

試圖Vikalp的解決方案,我幾乎有工作之後。我知道我的Facebook代碼正常工作,因爲我已經使用原生Android進行了測試。

所以新的解決方案是:在LIBGDX(Maininterface)中創建一個接口,在LIBGDX中創建一個facebookCallBack接口,以接收來自MainInterface的回調信息。 創建一個創建MainInterface幷包含我所有的Facebook代碼的類(它在原生Android上按預期工作)。我創建了這個類的一個實例,並將其傳遞給LIBGDX,我可以從MainInterface接收facebookCallBack中的回調。

我在關於applicaitonID的logcat中得到一個null錯誤,但它與我的原生android項目設置相同,所以它應該在清單的元數據中找到id。

的logcat的輸出如下印刷:

07-09 10:31:57.660: D/dalvikvm(7261): GC_CONCURRENT freed 214K, 7% free 12371K/13191K,    paused 3ms+12ms, total 34ms 
07-09 10:32:00.200: I/System.out(7261): clicked! 
07-09 10:32:00.210: W/dalvikvm(7261): VFY: unable to find class referenced in signature (Landroid/support/v4/app/Fragment;) 
07-09 10:32:00.210: W/dalvikvm(7261): VFY: unable to find class referenced in signature (Landroid/support/v4/app/Fragment;) 
07-09 10:32:00.210: I/dalvikvm(7261): Could not find method android.support.v4.content.LocalBroadcastManager.getInstance, referenced from method com.facebook.Session.postActiveSessionAction 
07-09 10:32:00.210: W/dalvikvm(7261): VFY: unable to resolve static method 304: Landroid/support/v4/content/LocalBroadcastManager;.getInstance (Landroid/content/Context;)Landroid/support/v4/content/LocalBroadcastManager; 
07-09 10:32:00.210: D/dalvikvm(7261): VFY: replacing opcode 0x71 at 0x0009 
07-09 10:32:00.295: W/dalvikvm(7261): threadid=11: thread exiting with uncaught exception (group=0x40d422a0) 
07-09 10:32:00.300: E/AndroidRuntime(7261): FATAL EXCEPTION: GLThread 2837 
07-09 10:32:00.300: E/AndroidRuntime(7261): java.lang.NullPointerException 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at android.content.ContextWrapper.getPackageManager(ContextWrapper.java:86) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at com.facebook.internal.Utility.getMetadataApplicationId(Utility.java:166) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at com.facebook.Session.<init>(Session.java:221) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at com.facebook.Session.<init>(Session.java:213) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at com.facebook.Session$Builder.build(Session.java:1454) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at com.facebook.Session.openActiveSession(Session.java:863) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at com.facebook.Session.openActiveSession(Session.java:805) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at com.FB.GDX.FBActivity$1.getResultFromFaceBook(FBActivity.java:66) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at com.FB.GDX.GDXScreen$1.clicked(GDXScreen.java:123) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at com.badlogic.gdx.scenes.scene2d.utils.ClickListener.touchUp(ClickListener.java:82) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:57) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at com.badlogic.gdx.scenes.scene2d.Stage.touchUp(Stage.java:334) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at com.badlogic.gdx.backends.android.AndroidInput.processEvents(AndroidInput.java:359) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:486) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516) 
07-09 10:32:00.300: E/AndroidRuntime(7261):  at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 
07-09 10:32:04.060: D/dalvikvm(7261): GC_CONCURRENT freed 356K, 8% free 12449K/13447K,    paused 3ms+2ms, total 22ms 

//編輯2

在機器人側,我有創建MainInterface因爲我需要一個活動啓動會話的活性。該類的代碼如下:

public class FBActivity extends Activity { 


private Activity thisActivity = this; 
private MainInterface object; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 



} 
    //methods 
    public MainInterface getMaininterface() 
    { 
     if(object==null) 
     { 
      //create MainInterface object for facebook callbacks 
      object = new MainInterface(){ 

       CallBackInterface fbCallbacks; 

       private String TAG = "MainActivity"; 

       public Session.StatusCallback callback; 



       public void registerCallBackInterFace(CallBackInterface callBacks){ 

        this.fbCallbacks = callBacks; 

       } 

       public Session.StatusCallback getCallback() 
       { 
        return this.callback; 
       } 

       public void getResultFromFaceBook(){ 
        /* write your code for faceBook here */ 


        Session.openActiveSession(thisActivity,true, new Session.StatusCallback() { 
         @Override 
         public void call(Session session, SessionState state, Exception exception) { 
          if (state.isOpened()) { //note: I think session.isOpened() is the same 

          fbCallbacks.setLoggedIn(true); 

           Log.i(TAG, "Access Token" + session.getAccessToken()); 

           Request.executeMeRequestAsync(session, 

           new Request.GraphUserCallback() { 


            @Override 
            public void onCompleted(GraphUser user, 
              Response response) { 
             // TODO Auto-generated method stub 
              if (user != null) { 

              email = user.asMap().get("email").toString(); 

              Log.i(TAG, "User ID " + user.getId()); 

              Log.i(TAG, "Email " + user.asMap().get("email")); 




             } 
            } 

           }); 

          } else if (state.isClosed()) { 



           fbCallbacks.setLoggedIn(false); 
          } 


         } 




        }); 
        System.out.println("main interface created"); 


       } 


       };} 
     return object; 
    } 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
    } 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

}

當LIBGDX一個按鈕被按下的getResultFromFaceBook()方法被調用。

// EDIT 3

的的AppID在清單中被引用這樣的:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/> 

和ID的值被存儲在的strings.xml這樣:

<string name="app_id">**************</string> 

packageManager可能會給出空錯誤,但我不確定。

+0

請提供代碼如何在代碼中使用應用程序ID – 2013-07-09 12:16:42

+0

我已經用代碼更新了我的問題,我相信當我使用「Session.openActiveSession(thisActivity,true,new Session.StatusCallback())創建會話時, {..「,但我真的不知道,我已經在一個核心的Android項目上測試了相同的代碼,它的工作原理是完美的..感謝任何幫助/建議 – SEMJ 2013-07-09 17:28:15

+0

我認爲你提供應用程序ID的方式可能不是或者您可能使用了錯誤的標籤來使用應用程序ID,請在您的代碼中提供如何使用應用程序ID的行 – 2013-07-10 13:23:10

回答

2

你可以做的是在android項目中實現你的Facebook庫,並從你創建的接口調用該庫的所有方法。假設你的interace被命名爲MainInterface

爲了從android端獲得結果到你的主項目中,你可以創建另一個接口說CallBackInterFace以及它在主項目中的實現類,並註冊這個接口和你的android項目並獲得回調那裏..

例如。 在主項目,您可以創建界面

public interface MainInterFace{ 

    public interface CallBackInterface{ 
     public void getInt(int output); 
    } 

    public void registerCallBackInterFace(CallBackInterface callBacks); 

    public void getResultFromFaceBook(); 
} 

的主要項目爲創建一個實施回調類:通過調用

..... 
registerCallBackInterFace(new FaceBookCallBacks()); 
.... 

此類與Android項目的

class FaceBookCallBacks implements CallBackInterFace{ 
    public void getInt(int output){ 
     System.out.println(output); 
    } 
} 

登記對象在Android端你可以做什麼是

創建實現該接口的對象爲

... 

MainInterFace object = new MainInterFace(){ 

     CallBackInterface callback; 

     public void registerCallBackInterFace(CallBackInterface callBacks){ 
      this.callback = callbacks; 
     } 

     public void getResultFromFaceBook(){ 
      /* write your code for faceBook here */ 
      int result = 10; //eg for returning a value 
      callback.getInt(result); 
     } 
}; 
... 

這可以幫助您與您的iOS和GWT項目都

你甚至可以訪問此鏈接來檢查的解決方案https://code.google.com/p/libgdx/wiki/ApplicationPlatformSpecific

+0

嘿Vikalp,我嘗試了你的解決方案並且幾乎有效,我已經編輯了我的答案來顯示一個問題,希望你能幫我解決它,謝謝你的迴應。 – SEMJ 2013-07-09 09:43:29

+0

我在回答中添加了第二個編輯,乾杯。 – SEMJ 2013-07-09 17:26:34

1

如果我理解正確的話您的問題,一個解決辦法是:

- 創建一個項目(即FacebookImpl),它實現你的Facebook任務。你可以在那裏實現接口和你的具體類。所以,這個項目取決於Facebook SDK。

- 在LibGDX Core項目中包含該項目,並通過「FacebookImpl」撥打電話。因此,從您的MainActivity中,您可以將您的上下文提供給「FacebookImpl」,並且您的LibGDX核心項目將在不知道任何Android類的情況下進行調用。

最後,你的「FacebookImpl」應該有一個實例。您應該在MainActivity中初始化一次,並且核心項目應該使用相同的實例。

希望它有幫助,儘管它已經有一段時間以來,你問。

+0

感謝您回覆我已經嘗試Vikalp的解決方案,但是我收到一個錯誤,希望您能幫我解決這個問題。乾杯 – SEMJ 2013-07-09 09:44:09

+0

getResultFromFacebook()方法是在覈心項目中定義的?那種方法會發生什麼?如果您直接嘗試從核心項目中打開新會話,我認爲它將無法找到該appid。但是,如果您嘗試通過您的界面(在Android項目中定義)打開新會話,我不確定發生了什麼。提供一些代碼可能會有所幫助。 – 2013-07-09 13:37:24

+0

我已經添加了第二個編輯到我的回答,乾杯。 – SEMJ 2013-07-09 17:26:19

0

我也有類似的設置和它的作品。根據你的錯誤日誌,看來Android的支持庫丟失:

Could not find method android.support.v4.content.LocalBroadcastManager.getInstance, referenced from method com.facebook.Session.postActiveSessionAction 

可以包括從facebookSDK的libs文件夾Android的支持,v4.jar。確保此jar文件正在Android項目的Java Build Path中導出並推送到列表的頂部。