Я интегрирую FaceBook
с Libgdx
. Некоторые из FaceBook
методов требуют контекста (из Android Activity
). Я нашел ресурсы, которые помогут мне с этим
После того, как я последовал этому руководству, у меня был свой Interface
, затем я создал объект, реализующий этот Interface
. (этот объект содержал Context
) и передал этот объект методу инициализации в MainActivity
моего проекта Android. Проблема в том, что я не могу получить доступ к контексту в моем основном проекте libgdx
, поскольку он не может получить доступ к библиотекам Android android.content.Context
.
Пожалуйста, помогите мне решить эту проблему, так как мне необходимо FaceBook
войти в систему с моим приложением.
Я уже просмотрел огромное количество вопросов по этому поводу, и ни на один из них нет однозначного ответа. Заранее спасибо.
//РЕДАКТИРОВАТЬ
После попытки решения Викалпа он почти заработал. Я знаю, что мой код facebook работает, поскольку я тестировал его с родным Android.
Итак, новое решение: Создал интерфейс в LIBGDX (Maininterface), создал интерфейс facebookCallBack в LIBGDX для получения информации обратного вызова от MainInterface. Создал класс, который создает MainInterface и содержит весь мой код facebook (который работает, как ожидалось, на собственном Android). Я создаю экземпляр этого класса и передаю его в LIBGDX, где я могу получать обратные вызовы в facebookCallBack из MainInterface.
Я получаю нулевую ошибку в logcat о applicationaitonID, однако он настроен так же, как мой собственный проект Android, поэтому он должен найти идентификатор в метаданных манифеста.
Вывод 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
На стороне Android у меня есть действие, которое создает 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;
}
}
Метод getResultFromFaceBook () вызывается при нажатии кнопки в LIBGDX.
// РЕДАКТИРОВАТЬ 3
Ссылка на AppID в манифесте выглядит следующим образом:
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
а значение идентификатора хранится в strings.xml как таковое:
<string name="app_id">**************</string>
PackageManager может выдавать нулевую ошибку, но я не уверен.