2

と統合FaceBookしていLibgdxます。一部のFaceBookメソッドには、( からの) コンテキストが必要ですAndroid Activity。これに役立つリソースをいくつか見つけまし

このチュートリアルに従った後Interface、私は自分の を持っていたので、それを実装したオブジェクトを作成しましたInterface。(このオブジェクトには が含まれていました)、そのオブジェクトをAndroid プロジェクトContextの initialize メソッドに渡しました。問題は、Android ライブラリにアクセスできないためMainActivity、メイン プロジェクトのコンテキストにアクセスできないことです。libgdxandroid.content.Context

FaceBookアプリでログインする必要があるため、この問題の解決にご協力ください。

私はすでにこれに関する膨大な量の質問に目を通しましたが、決定的な答えはありません. 前もって感謝します。

//編集

Vikalp のソリューションを試した後、私はほとんどそれを機能させました。ネイティブ Android でテストしたので、Facebook コードが機能することはわかっています。

SO新しい解決策は次のとおりです。MainInterface を作成し、すべての Facebook コードを含むクラスを作成しました (これは、ネイティブ android で期待どおりに動作します)。このクラスのインスタンスを作成し、それを LIBGDX に渡します。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

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"/>

ID の値は、strings.xml に次のように格納されます。

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

packageManager で null エラーが発生している可能性がありますが、わかりません。

4

3 に答える 3

2

できることは、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

于 2013-06-20T15:51:39.323 に答える
1

あなたの問題を正しく理解していれば、解決策は次のようになります。

- Facebook タスクを実装するプロジェクト (つまり FacebookImpl) を作成します。そこにインターフェイスと具象クラスを実装できます。したがって、このプロジェクトは Facebook SDK に依存しています。

- そのプロジェクトを LibGDX Core プロジェクトに含め、「FacebookImpl」を介して呼び出しを行います。したがって、MainActivity から Context を "FacebookImpl" に渡すことができ、LibGDX コア プロジェクトは Android クラスについて何も知らなくても呼び出しを行います。

-最後に、「FacebookImpl」には 1 つのインスタンスが必要です。MainActivity で一度初期化する必要があり、コア プロジェクトは同じインスタンスを使用する必要があります。

質問してから時間が経っていますが、お役に立てば幸いです。

于 2013-06-20T13:02:41.960 に答える
0

同様の設定があり、動作します。エラー ログによると、Android サポート ライブラリが見つからないようです。

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

facebookSDK の libs フォルダーから android-support-v4.jar を含めることができます。この jar ファイルが Android プロジェクトの Java ビルド パスでエクスポートされ、リストの一番上にプッシュされていることを確認してください。

于 2013-10-01T13:56:48.527 に答える