facebook与Android上的libgdx集成

问题描述:

我正在整合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

你可以做的是在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

如果我理解正确的话您的问题,一个解决办法是:

- 创建一个项目(即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

我也有类似的设置和它的作品。根据你的错误日志,看来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中导出并推送到列表的顶部。