facebook与Android上的libgdx集成
我正在整合FaceBook
与Libgdx
。一些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可能会给出空错误,但我不确定。
你可以做的是在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
如果我理解正确的话您的问题,一个解决办法是:
- 创建一个项目(即FacebookImpl),它实现你的Facebook任务。你可以在那里实现接口和你的具体类。所以,这个项目取决于Facebook SDK。
- 在LibGDX Core项目中包含该项目,并通过“FacebookImpl”拨打电话。因此,从您的MainActivity中,您可以将您的上下文提供给“FacebookImpl”,并且您的LibGDX核心项目将在不知道任何Android类的情况下进行调用。
最后,你的“FacebookImpl”应该有一个实例。您应该在MainActivity中初始化一次,并且核心项目应该使用相同的实例。
希望它有帮助,尽管它已经有一段时间以来,你问。
我也有类似的设置和它的作品。根据你的错误日志,看来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中导出并推送到列表的顶部。
请提供代码如何在代码中使用应用程序ID – 2013-07-09 12:16:42
我已经用代码更新了我的问题,我相信当我使用“Session.openActiveSession(thisActivity,true,new Session.StatusCallback())创建会话时, {..“,但我真的不知道,我已经在一个核心的Android项目上测试了相同的代码,它的工作原理是完美的..感谢任何帮助/建议 – SEMJ 2013-07-09 17:28:15
我认为你提供应用程序ID的方式可能不是或者您可能使用了错误的标签来使用应用程序ID,请在您的代码中提供如何使用应用程序ID的行 – 2013-07-10 13:23:10