интеграция facebook с libgdx на android

Я интегрирую 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 может выдавать нулевую ошибку, но я не уверен.


person SEMJ    schedule 23.04.2013    source источник
comment
укажите код, как вы используете идентификатор приложения в своем коде   -  person Vikalp Jain    schedule 09.07.2013
comment
Я обновил свой вопрос кодом, я считаю, что это может быть, когда я создаю сеанс с Session.openActiveSession (thisActivity, true, new Session.StatusCallback () {.., но я действительно не уверен, я тестировал то же самое код на основном проекте Android, и он работает безупречно .. Спасибо за любую помощь / совет   -  person SEMJ    schedule 09.07.2013
comment
Я думаю, что способ, которым вы указали идентификатор приложения, может не работать для вас. Или вы могли использовать неправильный тег для использования идентификатора приложения. укажите, как вы используете идентификатор приложения в своем коде   -  person Vikalp Jain    schedule 10.07.2013
comment
Я не понимаю, что вы имеете в виду под тем, где я его использую? он включен в манифест как метаданные и хранится как строковое значение в файле gdx res / values ​​/ strings.xml, я отредактировал свой код, чтобы показать, как на них ссылаются. Я думаю, что когда вы открываете сеанс, если appId не был указан, он ищет его в манифесте, я явно не использовал appID, поэтому он должен работать, однако в logcat я не уверен, что это appID или packageManager (android.content.ContextWrapper.getPackageManager (ContextWrapper.java:86)), который выдает нулевую ошибку.   -  person SEMJ    schedule 10.07.2013


Ответы (3)


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

Чтобы получить результат со стороны Android в основном проекте, вы можете создать другой интерфейс, например 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);
   }
}

зарегистрируйте объект этого класса в проекте Android, вызвав

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

На стороне 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

person Vikalp Jain    schedule 20.06.2013
comment
Привет, Викалп, я попробовал ваше решение, и оно почти работает, я отредактировал свой ответ, чтобы показать проблему, надеюсь, вы поможете мне решить ее, спасибо за ответ. - person SEMJ; 09.07.2013
comment
Я добавил второе РЕДАКТИРОВАНИЕ к своему ответу, Ура. - person SEMJ; 09.07.2013

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

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

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

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

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

person Emre Dirican    schedule 20.06.2013
comment
Спасибо за ответ. Я попытался найти решение Vikalp, но получаю сообщение об ошибке. Надеюсь, вы поможете мне решить эту проблему. Ваше здоровье - person SEMJ; 09.07.2013
comment
Метод getResultFromFacebook () определен в основном проекте? И что происходит в этом методе? Например, если вы напрямую пытаетесь открыть новый сеанс из основного проекта, я думаю, что он не сможет найти appid. Однако, если вы пытаетесь открыть новый сеанс через свой интерфейс (определенный в проекте Android), я не уверен, что происходит. Добавление кода может помочь. - person Emre Dirican; 09.07.2013
comment
Я добавил второе РЕДАКТИРОВАНИЕ к своему ответу, Ура. - person SEMJ; 09.07.2013
comment
Да, facebook SDK использует appID неявно, считывая его из манифеста, если вы не предоставляете его при открытии сеанса, поэтому с этой частью все в порядке. Я думаю, что лучшее, что вы можете сделать, - это углубленная отладка, и я бы посмотрел, какой метод вызывается из какого потока. - person Emre Dirican; 11.07.2013
comment
Ах, спасибо, я все пересмотрю. В logcat я не уверен, что это appID или packageManager (android.content.ContextWrapper.getPackageManager (ContextWrapper.j‌ ava: 86)), который дает нулевую ошибку, что сбивает с толку и заставляет меня думать, что моя активность установлена up неправильно, когда я открываю сеанс: / - person SEMJ; 13.07.2013

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

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

Вы можете включить android-support-v4.jar из папки libs facebookSDK. Убедитесь, что этот файл jar экспортируется в путь сборки Java проекта Android и помещен в верхнюю часть списка.

person Man Kit Chong    schedule 01.10.2013