2013-04-23 2 views
2

Я интегрирую FaceBook с Libgdx. Некоторые из методов FaceBook требуют контекста (от Android Activity). Я нашел несколько ресурсов, чтобы помочь мне с thisинтеграция facebook с libgdx на android

После того, как я последовал этому руководству, у меня был мой Interface, тогда я создал объект, который реализовал это Interface. (этот объект содержал Context) и передал этот объект в метод initialize в MainActivity моего проекта Android. Проблема в том, что я не могу получить доступ к контексту в моем основном проекте libgdx, так как он не может получить доступ к библиотекам Android android.content.Context.

Пожалуйста, помогите мне решить эту проблему, так как необходимо иметь FaceBook логин с моим приложением.

Я уже просмотрел огромное количество вопросов по этому вопросу, и у вас нет окончательного ответа. Заранее спасибо.

// EDIT

После попытки решения Vikalp, я чуть это работает. Я знаю, что мой код facebook работает, так как я тестировал его с помощью встроенного андроида.

SO новое решение: Создал интерфейс в LIBGDX (Maininterface), создал интерфейс facebookCallBack в LIBGDX для получения информации обратного вызова от MainInterface. Создал класс, который создает MainInterface и содержит весь мой код в facebook (который работает так, как ожидается, на родном Android). Я создаю экземпляр этого класса и передаю его в LIBGDX, где я могу получать обратные вызовы в facebookCallBack, начиная с MainInterface.

Im получает нулевую ошибку в logcat о applicaitonID, однако она такая же, как и мой собственный проект андроида, поэтому он должен найти идентификатор в метаданных манифеста.

Выход 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 

// EDIT 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; 
} 

}

метод getResultFromFaceBook() вызывается, когда кнопка в LIBGDX нажата.

// РЕДАКТИРОВАТЬ 3

В AppID упоминается в манифесте, как это:

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

и значение идентификатора сохраняется в strings.xml как таковые:

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

ПакетManager может давать нулевую ошибку, но я не уверен.

+0

Просьба представить код, как вы используете идентификатор приложения в своем коде –

+0

Я обновил свой вопрос с помощью кода, я считаю, что это будет когда я создаю сеанс с сеансом Session.openActiveSession (thisActivity, true, new Session.StatusCallback() {.. ", но я действительно не уверен, я тестировал один и тот же код в основном проекте Android, и он работает безупречно. Спасибо за любую помощь/совет. – SEMJ

+0

. Я думаю, что способ, которым вы предоставили идентификатор приложения, может не быть работая для вас. Или вы могли использовать неправильный тег для использования идентификатора приложения. Укажите, как вы используете идентификатор приложения в своем коде. –

ответ

2

Что вы можете сделать, это реализовать свою библиотеку Facebook в проекте android и вызвать все методы этой библиотеки из созданного вами интерфейса. Пусть говорят, что ваше общение называется MainInterface.

Для получения результата с андроидной стороны в ваш основной проект вы можете создать другой интерфейс, который называется CallBackInterFace, а также его класс реализации в основном проекте и зарегистрировать этот интерфейс с вашим проектом android и получить обратные вызовы от там ..

например. В главном проекте вы можете создать интерфейс, как

public interface MainInterFace{ 

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

    public void registerCallBackInterFace(CallBackInterface callBacks); 

    public void getResultFromFaceBook(); 
} 

Создать Внедрение CallBack класса в главном проекте как:

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

регистра объекта этого класса с андроид проекта по телефону

..... 
registerCallBackInterFace(new FaceBookCallBacks()); 
.... 

На стороне андроида, что вы можете сделать, это

создать объект, реализующий этот интерфейс, как

... 

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); 
     } 
}; 
... 

Это может помочь вам с обеих ваших СВН и GWT Проекты

Вы даже можете посетить эту ссылку, чтобы проверить для решения https://code.google.com/p/libgdx/wiki/ApplicationPlatformSpecific

+0

Привет, Викальп. Я попытался найти решение и почти его работаю. Я отредактировал свой ответ, чтобы показать проблему, надеюсь, вы можете помочь мне решить ее, спасибо за ответ. – SEMJ

+0

Я добавил второй EDIT к моему ответу, Cheers. – SEMJ

1

Если я правильно понял вашу проблему, решение было бы:

-Создание проекта (т.е.FacebookImpl), который реализует ваши задачи Facebook. Вы можете реализовать интерфейс и свой конкретный класс. Таким образом, этот проект зависит от SDK для Facebook.

-Включить этот проект в проект вашего LibGDX Core и сделать ваши звонки через «FacebookImpl». Таким образом, из вашего MainActivity вы можете предоставить свой контекст в «FacebookImpl», а основной проект LibGDX сделает звонки, не зная ничего о классах Android.

-Возможно, ваш «FacebookImpl» должен иметь один экземпляр. Вы должны инициализировать его один раз в своем MainActivity, а основной проект должен использовать тот же экземпляр.

Надеюсь, это поможет, хотя прошло некоторое время с тех пор, как вы спросили.

+0

Спасибо за ответ, я попытался решить решение Vikalp, но я получаю сообщение об ошибке, надеюсь, вы можете помочь мне решить эту проблему. Приветствия – SEMJ

+0

Метод getResultFromFacebook() определяется в основном проекте? И что происходит в этом методе? Как и в случае, если вы пытаетесь открыть новый сеанс из основного проекта, я думаю, что он не сможет найти приложение. Однако, если вы пытаетесь открыть новый сеанс через свой интерфейс (определенный в проекте Android), я не уверен, что происходит. Поставка кода может помочь. –

+0

Я добавил второй EDIT к моему ответу, Cheers. – SEMJ

0

У меня есть аналогичный setup и он работает. Согласно вашему журналу ошибок, кажется андроид библиотека поддержки отсутствует:

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

Вы можете включить андроид-поддержку-v4.jar из папки ЛИЭСА facebookSDK в. Убедитесь, что этот файл jar экспортируется в Java Build Path на Android-проекте и помещен в начало списка.

Смежные вопросы