Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java facebook与android上的libgdx集成_Java_Android_Facebook_Libgdx - Fatal编程技术网

Java facebook与android上的libgdx集成

Java facebook与android上的libgdx集成,java,android,facebook,libgdx,Java,Android,Facebook,Libgdx,我正在将FaceBook与Libgdx集成。一些FaceBook方法需要上下文(来自Android活动)。我找到了一些资源来帮助我 在完成本教程之后,我有了接口,然后创建了一个实现该接口的对象。(此对象包含上下文),并将该对象传递到我的Android项目的MainActivity中的initialize方法中。问题是我无法访问主libgdx项目中的上下文,因为它无法访问android库android.content.context 请帮助我解决此问题,因为必须使用我的应用程序登录FaceBook

我正在将
FaceBook
Libgdx
集成。一些
FaceBook
方法需要上下文(来自
Android活动
)。我找到了一些资源来帮助我

在完成本教程之后,我有了
接口
,然后创建了一个实现该
接口
的对象。(此对象包含
上下文
),并将该对象传递到我的Android项目的
MainActivity
中的initialize方法中。问题是我无法访问主
libgdx
项目中的上下文,因为它无法访问android库
android.content.context

请帮助我解决此问题,因为必须使用我的应用程序登录
FaceBook

关于这一点,我已经研究了大量的问题,没有一个有明确的答案。提前谢谢

//编辑

在尝试了Vikalp的解决方案后,我几乎成功了。我知道我的facebook代码可以工作,因为我已经用原生android进行了测试

因此,新的解决方案是:在LIBGDX(Maininterface)中创建一个接口,在LIBGDX中创建一个facebookCallBack接口,以从Maininterface接收回调信息。 创建了一个类,该类创建MainInterface并包含我的所有facebook代码(在本机android上按预期工作)。我创建了这个类的一个实例,并将其传递给LIBGDX,在那里我可以从MainInterface接收facebookCallBack中的回调

我在日志中得到一个关于applicationId的空错误,但是它的设置与我的原生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
}

按下LIBGDX中的按钮时,将调用getResultFromFaceBook()方法

//编辑3

清单中引用的AppID如下所示:

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

ID的值存储在strings.xml中,如下所示:

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

packageManager可能给出了空错误,但我不确定。

如果我正确理解了您的问题,解决方案是:

-创建一个项目(即FacebookImpl),用于实现您的Facebook任务。您可以在那里实现接口和具体类。所以,这个项目依赖于Facebook SDK

-将该项目包括在LibGDX核心项目中,并通过“facebookinpl”进行调用。因此,从MainActivity中,您可以向“FacebookImpl”提供上下文,并且您的LibGDX核心项目将在不了解任何Android类的情况下进行调用

-最后,您的“FacebookImpl”应该有一个实例。您应该在MainActivity中初始化它一次,并且核心项目应该使用相同的实例


希望它能帮上忙,尽管你问起这个问题已经有一段时间了

您可以在android项目中实现您的Facebook库,并从您创建的界面调用该库的所有方法。假设您的交互被命名为MainInterface

为了从android端获得主项目的结果,您可以在主项目中创建另一个接口(如CallBackInterFace)及其实现类,并在您的android项目中注册此接口,然后从那里获得回调

例如。 在主项目中,您可以将接口创建为

public interface MainInterFace{

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

    public void registerCallBackInterFace(CallBackInterface callBacks);

    public void getResultFromFaceBook();
}
...

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);
       }
};
...
在主项目中创建一个实现回调类,如下所示:

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

.....
registerCallBackInterFace(new FaceBookCallBacks());
....
在android方面,您可以做的是

创建一个对象,将该接口实现为

public interface MainInterFace{

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

    public void registerCallBackInterFace(CallBackInterface callBacks);

    public void getResultFromFaceBook();
}
...

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项目


您甚至可以访问此链接来检查解决方案

我有类似的设置,它可以正常工作。根据您的错误日志,似乎缺少android支持库:

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

您可以从facebookSDK的libs文件夹中包含android-support-v4.jar。确保此jar文件在Android项目的Java构建路径中导出,并推到列表顶部。

嘿,Vikalp,我尝试了您的解决方案,几乎成功了,我编辑了我的答案以显示问题,希望您能帮助我解决问题,感谢您的回复。我在我的答案中添加了第二次编辑,干杯。感谢您的回复,我尝试了Vikalp的解决方案,但是我遇到了一个错误,希望您能帮助我解决这个问题。CheesGetResultFromFacebook()方法是否在核心项目中定义?这种方法会发生什么?如中所示,如果您直接尝试从核心项目打开一个新会话,我认为它将无法找到appid。但是,如果您试图通过界面(在Android项目中定义)打开一个新会话,我不确定会发生什么。提供一些代码可能会有所帮助。我在我的答案中添加了第二个编辑,Cheers。是的,facebook SDK隐式地使用appID——从清单中读取它——如果您在打开会话时不提供它,那么该部分就可以了。我认为你们能做的最好的事情就是进行深入的调试,我会看看哪个线程调用了哪个方法。啊,谢谢,呃,我会重新检查所有的事情。在logcat中,我不确定是appID还是packageManager(android.content.ContextWrapper.getPackageManager(ContextWrapper.j‌​ava:86))这是一个空错误,这让我感到困惑,并使我认为我的活动设置在我打开会话时是错误的:/请提供代码您如何在代码中使用应用程序id我已经用代码更新了我的问题,我相信这可能是在我使用“session.openActiveSession”创建会话时发生的(thisActivity,true,new Session.StatusCallback(){..),但我真的不确定,我在一个核心android项目上测试了相同的代码,它工作得很完美..感谢您的帮助/建议我认为您提供应用程序id的方式可能不适合您。或者您可能使用了错误的标记来使用应用程序id。请支持