11

私は今、共有ボタン(ダイアログ)が欲しい小さなプロジェクトをやっています。ユーザーがそれをクリックすると、それは彼/彼女のfbアカウントに自動ログインし、彼らが望むコンテンツを共有します。

fb devからのチュートリアルの後、私のアプリはコンテンツをwallと共有できますが、共有する前にfbloginボタンでログインする必要があります。

私はstackoverflowからの投稿を読みました: Android-FacebookSDK3-LoginButtonなしでプログラムでログインする方法

更新:プロジェクトにonActivityResultを使用してfeedDialogを実装しましたが、1つのボタンでログインして共有できることがわかりました。 ただし、アプリを再構築したり、電話を再起動したりするときは、最初に共有するためにボタンを2回押す必要がありますが、後で正常になります(1回押す)。

PSIはshareActionProviderでそれを実装しています

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getSupportMenuInflater().inflate(R.menu.content_main, menu);
    /** Getting the actionprovider associated with the menu item whose id is share */
    mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.share).getActionProvider();

    /** Getting the target intent */
    Intent intent = getDefaultShareIntent();

    /** Setting a share intent */       
    if(intent!=null){
        mShareActionProvider.setShareIntent(intent);
        mShareActionProvider.setOnShareTargetSelectedListener(new OnShareTargetSelectedListener(){
            @Override
            public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) {
                if ("com.facebook.katana".equals(intent.getComponent().getPackageName())){
                    if (Session.getActiveSession() == null || Session.getActiveSession().isClosed()) {
                        Session.openActiveSession(Content.this, true, null);
                }else{
                        publishFeedDialog();
                    }
                    return true;
                }
                return false;
            }
        });
    }

    return super.onCreateOptionsMenu(menu);
}
@Override
   public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
        if (Session.getActiveSession() != null || Session.getActiveSession().isOpened())
            publishFeedDialog();
    }
private void publishFeedDialog() {
        Bundle params = new Bundle();
        params.putString("name", "ab");
        params.putString("caption", "cd");
        params.putString("description", "def");
        params.putString("link", "https://developers.facebook.com/android");
        params.putString("picture", "abc.jpg");

        WebDialog feedDialog = (
            new WebDialog.FeedDialogBuilder(Content.this,
                Session.getActiveSession(),
                params))
            .setOnCompleteListener(new OnCompleteListener() {

                @Override
                public void onComplete(Bundle values,
                    FacebookException error) {
                    if (error == null) {
                        // When the story is posted, echo the success
                        // and the post Id.
                        final String postId = values.getString("post_id");
                        if (postId != null) {
                            Toast.makeText(Content.this,
                                "Posted story, id: "+postId,
                                Toast.LENGTH_SHORT).show();
                        } else {
                            // User clicked the Cancel button
                            Toast.makeText(Content.this.getApplicationContext(), 
                                "Publish cancelled", 
                                Toast.LENGTH_SHORT).show();
                        }
                    } else if (error instanceof FacebookOperationCanceledException) {
                        // User clicked the "x" button
                        Toast.makeText(Content.this.getApplicationContext(), 
                            "Publish cancelled", 
                            Toast.LENGTH_SHORT).show();
                    } else {
                        // Generic, ex: network error
                        Toast.makeText(Content.this.getApplicationContext(), 
                            "Error posting story", 
                            Toast.LENGTH_SHORT).show();
                    }
                }

            })
            .build();
        feedDialog.show();
        }
4

4 に答える 4

15

解決策を提供してくれたMing Liに感謝します

やっと答えが出ました!!!! 以下はコードです。他の開発者に役立つことを願っています

private Session.StatusCallback callback = new Session.StatusCallback() {
          @Override
          public void call(Session session, SessionState state,
            Exception exception) {
           onSessionStateChange(session, state, exception);
          }
    };
    private void onSessionStateChange(Session session, SessionState state, Exception exception) {
        if (state.isOpened()) {
            publishFeedDialog();
        }
    }
    //........................
                    if (Session.getActiveSession() == null || Session.getActiveSession().isClosed()) {
                            Session.openActiveSession(Content.this, true, callback);
                    }else{
                            publishFeedDialog();
                        }
     //.......................
    @Override
       public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
        }
    private void publishFeedDialog() {
            //........................
      }
于 2013-02-22T18:55:20.463 に答える
11

ここでの問題は、メニューを作成するときに、アクティブなセッションが null かどうかを確認し、null の場合は openActiveSession を呼び出し、onActivityResult が呼び出されるのを待つことだと思います。

これはすべて正しいですが、ユーザーが以前にアプリを承認している場合、アクセス トークンなどはすべてトークン キャッシュに保存されており、openActiveSession を呼び出すと、(onActivityResult を呼び出さずに) 実際にすぐにセッションが開かれます。

本当に正しい方法は、(null ではなく) 開いている呼び出しに StatusCallback を渡し、その呼び出しで、セッションが開いているかどうかを確認し、publishFeedDialog メソッドを呼び出すことです。

于 2013-02-22T17:54:15.770 に答える
0

LoginButtonin facebook-sdk-3.0 は、FB からセッションを取得するための単なるツールです。

すでに FB からセッションを取得している場合は、公開する権限を確認する必要があります。

于 2013-02-20T08:45:34.303 に答える