我正在整合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可能會給出空錯誤,但我不確定。
請提供代碼如何在代碼中使用應用程序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