2013-10-17 3 views
0

StackOverflow에서 여러 답변을 제공하는 한 자습서 및 설명서에 따라 Android App usign Facebook SDK에 로그인 흐름을 구현하고 있습니다.안드로이드 용 페이스 북용 SDK가 전자 메일 허가를 요청하지 않습니다.

"LoginButton"이 아닌 Button에 UserRegistrationActivity가 있습니다. 나는 올바른 권한 (basic_info, email)을 요구하고 있다고 생각한다. 사용 권한을 묻는 페이스 북 대화 상자가 표시되지만 이메일이 나열되지 않아 내 access_token을 받으면 사용자 이메일 서버 측에 액세스 할 수 없습니다.

내 코드 :

package com.test.user; 

import java.util.Arrays; 

import android.app.ProgressDialog; 
import android.content.Intent; 
import android.content.IntentSender.SendIntentException; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.text.TextUtils; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Toast; 
import com.actionbarsherlock.app.SherlockActivity; 
import com.actionbarsherlock.view.Menu; 
import com.actionbarsherlock.view.MenuItem; 
import com.actionbarsherlock.view.Window; 
import com.facebook.Session; 
import com.facebook.SessionState; 
import com.test.user.domain.User; 
import com.test.user.services.UserLoginService; 

public class UserRegistrationActivity extends SherlockActivity implements OnClickListener,ConnectionCallbacks, 
OnConnectionFailedListener { 
private static final String TAG = "UserRegistrationActivity"; 
private static final int REQUEST_CODE_RESOLVE_ERR = 9000; 
private ProgressDialog mConnectionProgressDialog; 
private PlusClient mPlusClient; 
private ConnectionResult mConnectionResult; 
private Session session; 
private Session.StatusCallback statusCallback = 
new SessionStatusCallback(); 
SharedPreferences settings; 
UserRegistrationActivity _activity; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
    setContentView(R.layout.activity_user_registration); 
    settings = getSharedPreferences(TestApplication.PREFS_NAME, 0); 

    setupActionBar(); 
    _activity = this; 
} 

public void onClickLogin(View v) { 
    getSherlock().setProgressBarIndeterminateVisibility(true); 
    Session session = Session.getActiveSession(); 
    if (session != null && !session.isOpened() && !session.isClosed()) { 
     session.openForRead(new Session.OpenRequest(this) 
     .setPermissions(Arrays.asList("basic_info","email")) 
     .setCallback(statusCallback)); 
     } else { 
     Session.openActiveSession(this, true, statusCallback); 
    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

} 
private void setupActionBar() { 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 
} 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 

     case android.R.id.home: 
     // app icon in action bar clicked; go home 
     finish(); 
     return true; 

     default: 
     return super.onOptionsItemSelected(item); 
    } 
} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater(); 
    inflater.inflate(R.menu.user_registration, (com.actionbarsherlock.view.Menu) menu); 
    return super.onCreateOptionsMenu(menu); 
} 


@Override 
public void onDisconnected() { 
    Log.d(TAG, "disconnected"); 
} 
@Override 
protected void onActivityResult(int requestCode, int responseCode, Intent intent) { 
    if(requestCode == 2){ 
     if(responseCode ==RESULT_OK){ 
      if(intent.getExtras().containsKey("user_id")){ 
       String userId = intent.getExtras().getString("user_id"); 
       Intent returnIntent = new Intent(); 
       returnIntent.putExtra("user_id", userId); 
       setResult(RESULT_OK,returnIntent); 
       getSherlock().setProgressBarIndeterminateVisibility(true); 
       finish(); 
       }else{ 
       getSherlock().setProgressBarIndeterminateVisibility(true); 
      } 
     } 

    }else{ 
     Session.getActiveSession().onActivityResult(this, requestCode, responseCode, intent); 
    } 

} 
private class SessionStatusCallback implements Session.StatusCallback { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     if(!TextUtils.isEmpty(session.getAccessToken())){ 
      SharedPreferences.Editor editor = settings.edit(); 
      editor.putString("user_token","@[email protected]:"+session.getAccessToken()); 
      editor.putString("user_token_type","FACEBOOK"); 
      // Commit the edits! 
      editor.commit(); 

      new UserLoginService(_activity).execute("@[email protected]:"+session.getAccessToken()); 

     } 
    } 
} 
public void onResultFromAsyncTask(User result) { 
    if(result!=null){ 
     Intent returnIntent = new Intent(); 
     returnIntent.putExtra("user_id", result.getId()); 
     setResult(RESULT_OK,returnIntent); 
     getSherlock().setProgressBarIndeterminateVisibility(true); 
     finish(); 
    } 
} 

}

답변

2

함께 작동합니다 다음 코드 " else "의 경우, 빈 권한리스트 (기본적으로"basic_info "만 포함)로 openActiveSession 메소드를 호출합니다.

은이에 onClickLogin을 변경해보세요 :)이 Session.openActiveSession (의 세번째 매개 변수를 사용하는 것입니다 이메일 권한을 요청 전화하는

Session session = Session.getActiveSession(); 
if (session == null) { 
    session = new Session(this); 
    Session.setActiveSession(session); 
} 
if (!session.isOpened() && !session.isClosed())) { 
    session.openForRead(new Session.OpenRequest(this) 
     .setPermissions(Arrays.asList("basic_info","email")) 
     .setCallback(statusCallback)); 
} 
+0

고맙습니다! 당신의 대답이 효과가있었습니다. – Ejmedina

0

사용이 항상 것 때문에 그것은 "이메일"권한을 요청 아니에요

private void FaceBookSignIn() 
    { 
    facebookBtn.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View arg0) { 
     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(YourActivity.this, false, 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) { 



               UserID=user.getId(); 
               firstName=user.getFirstName(); 
               Lastname=user.getLastName(); 
               Gender=user.getProperty("gender").toString(); 
               Email=user.getProperty("email").toString(); 
               DateofBirth=user.getBirthday(); 



               } 
              } 
             }); 
          } 
         } 
        }); 
       } 
      // 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 Session.Builder(SignIn_Rewards.this).build(); 
      Session.setActiveSession(session); 
      session.openForPublish(op); 
     } 



    } 
    }) ; 

     } 

    @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) { 

              fromFB=true; 

             UserID=user.getId(); 
             firstName=user.getFirstName(); 
             Lastname=user.getLastName(); 
             Gender=user.getProperty("gender").toString(); 
             Email=user.getProperty("email").toString(); 
             DateofBirth=user.getBirthday(); 


             } 
            } 
           }); 
        } 
       } 
      }); 
     } 
    } 
1

빠른 방법을 다음과 같이

Session.openActiveSession(getActivity(), true, Arrays.asList("basic_info","email") ,new Session.StatusCallback() {...}); 
+0

이것은 실제 솔루션입니다! – Roel

관련 문제