2013-05-02 12 views
10

私はアンドロイド用にFacebook 3.0 SDKを使用しています。私はFacebookログインして実装する必要があります。私はユーザーIDのようなユーザーの基本情報にアクセスしています。しかし、私はユーザーの電子メールにもアクセスしたいと思っています。私は多くのブログやフォーラムに参加しましたが、その方法を理解することはできません。Facebookのログインからユーザーの電子メールIDを取得する権限を設定します。

私は自分のアンドロイドボタンを使ってログインしていません。com.facebook.widget.LoginButtonです。デフォルトアンドロイドボタンで行かなければならないだろう、私は自分の要件を持って、

authButton.setReadPermissions(Arrays.asList("basic_info","email")); 

しかし:私はそれが簡単だったボタンでFacebookログを使用する場合は、単にこれらの行を使用する必要があります。

Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
     this, Arrays.asList("email")); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mLogin = (Button) findViewById(R.id.logIn); 
    mLogin.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 
    // start Facebook Login 
    Session.openActiveSession(this, true, new Session.StatusCallback() { 

     // callback when session changes state 
     @Override 
     public void call(final Session session, SessionState state, 
       Exception exception) { 
      if (session.isOpened()) { 
       session.requestNewReadPermissions(newPermissionsRequest); 
       // make request to the /me API 
       Request.executeMeRequestAsync(session, 
         new Request.GraphUserCallback() { 

          // callback after Graph API response with user 
          // object 
          @Override 
          public void onCompleted(GraphUser user, 
            Response response) { 
           if (user != null) {       
            System.out 
              .println("Facebook Response: " 
                + response.toString()); 
            access_token = session.getAccessToken(); 
            firstName = user.getFirstName(); 
            fb_user_id = user.getId(); 


            System.out 
              .println("Facebook Access token: " 
                + access_token); 
            System.out.println("First Name:" 
              + firstName); 
            System.out.println("FB USER ID: " 
              + fb_user_id); 


           } 
          } 
         }); 
      } 
     } 
    }); 

} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Session.getActiveSession().onActivityResult(this, requestCode, 
      resultCode, data); 
} 

は私がログに印刷していますすべてのそれらのものを得ることができるんだけど、ユーザープロファイルから電子メールを取得できませんでした:ここでは、私がこれまで行っているものです。

どうすればいいですか?

何か助けていただければ幸いです。

+0

developer.facebook.comアプリケーションページにアプリケーション情報を追加しましたか? – dwbrito

+0

はい、あなたが提案したように、私はユーザーとフレンドの許可の電子メールを追加しました。しかし今まで運がない。 – Anupam

+0

@Anupamこんにちは、この問題を見てください:http://stackoverflow.com/questions/30389180/facebook-oncompleted-email-java-lang-nullpointerexception – Sun

答えて

15

はそれを解決:ここに私が...

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mLogin = (Button) findViewById(R.id.logIn); 
    mLogin.setOnClickListener(this); 

} 

@Override 
public void onClick(View v) { 

    Session currentSession = Session.getActiveSession(); 
    if (currentSession == null || currentSession.getState().isClosed()) { 
     Session session = new Session.Builder(context).build(); 
     Session.setActiveSession(session); 
     currentSession = session; 
    } 

    if (currentSession.isOpened()) { 
     // Do whatever u want. User has logged in 

    } else if (!currentSession.isOpened()) { 
     // Ask for username and password 
     OpenRequest op = new Session.OpenRequest((Activity) context); 

     op.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO); 
     op.setCallback(null); 

     List<String> permissions = new ArrayList<String>(); 
     permissions.add("publish_stream"); 
     permissions.add("user_likes"); 
     permissions.add("email"); 
     permissions.add("user_birthday"); 
     op.setPermissions(permissions); 

     Session session = new Builder(MainActivity.this).build(); 
     Session.setActiveSession(session); 
     session.openForPublish(op); 
    } 
} 

public void call(Session session, SessionState state, Exception exception) { 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (Session.getActiveSession() != null) 
     Session.getActiveSession().onActivityResult(this, requestCode, 
       resultCode, data); 

    Session currentSession = Session.getActiveSession(); 
    if (currentSession == null || currentSession.getState().isClosed()) { 
     Session session = new Session.Builder(context).build(); 
     Session.setActiveSession(session); 
     currentSession = session; 
    } 

    if (currentSession.isOpened()) { 
     Session.openActiveSession(this, true, new Session.StatusCallback() { 

      @Override 
      public void call(final Session session, SessionState state, 
        Exception exception) { 

       if (session.isOpened()) { 

        Request.executeMeRequestAsync(session, 
          new Request.GraphUserCallback() { 

           @Override 
           public void onCompleted(GraphUser user, 
             Response response) { 
            if (user != null) { 

             TextView welcome = (TextView) findViewById(R.id.welcome); 
             welcome.setText("Hello " 
               + user.getName() + "!"); 

             access_token = session 
               .getAccessToken(); 
             firstName = user.getFirstName(); 
             fb_user_id = user.getId(); 

             System.out 
               .println("Facebook Access token: " 
                 + access_token); 
             System.out.println("First Name:" 
               + firstName); 
             System.out.println("FB USER ID: " 
               + fb_user_id); 

            } 
           } 
          }); 
       } 
      } 
     }); 
    } 
} 

を行っているものです今私は公開許可の残りの部分と電子メールの許可を得ることができますよ。

これを他人を助けることができるように受け入れられた回答としてマークします。

+5

'authButton.setReadPermissions(Arrays.asList(" email "));'このような電子メールにアクセスしようとしましたが、 'user.asMap()。get(" email ")'のように読み取り権限を設定しようとしましたが、常に 'null'を返します。 – toobsco42

+0

この例ではFacebookAppIdを設定する必要がありますか? –

+0

値が/ strings.xmlが 'appId' – Anupam

2

TL; DR:このようなものを使用してメールを受け取る:

String email = (String) user.getProperty("email"); 

あなたのコードについてのコメントが1つあります。 「電子メール」は読み取り権限であるため、取得するために別の権限リクエストを作成する必要はありません。あなたはこのような何か行うことができます(未テストコードを、そのわずかの誤差があるかもしれません):

Session s = new Session(this); 
Session.setActiveSession(s); 
Session.OpenRequest request = new Session.OpenRequest(this); 
request.setPermissions(Arrays.asList("basic_info","email")); 
request.setCallback(/* your callback here */); 
s.openForRead(request); 

を、あなたはあなたのコールバックで新しい許可要求を取り除くことができます。

+0

私の 'MainActivity'にこのコードを置くべきでしょうか? 'String email =(String)user.getProperty(" email ");'は私にヌル応答を与えています。 – Anupam

+0

これを任意のアクティビティに入れることができます。 –

+0

あなたが 'onClick()'でセッションを開始しているのがわかりますので、その中にあなたのコードを入れる必要があります。そして、ここには何がありますか? 'request.setCallback(/ *あなたのコールバック* /);'、私のコールバックは何ですか?これで私を導いてください。それは私のために非常に役立つでしょう。 – Anupam

関連する問題