2013-11-25 1 views
0

로그인 할 때 Facebook을 사용하려는 앱에서 작업하고 있습니다. 하지만 처음에는 "전자 메일"권한을 요청한 다음 사용자가 게시하려고 할 때 "publish_actions"권한 만 요청합니다. 페이스 북 사이트에서 개발자를위한 튜토리얼을 따랐지만 예상대로 작동하지 않습니다. 내 문제는 첫 번째 로그인입니다.Loggin Facebook (android)

import java.util.Arrays; 
import java.util.List; 

import android.content.Intent; 
import android.os.Bundle; 
import android.os.Message; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.LinearLayout; 
import android.widget.RelativeLayout; 

import com.facebook.Session; 
import com.facebook.Session.OpenRequest; 
import com.facebook.SessionState; 
import com.facebook.UiLifecycleHelper; 
import com.facebook.widget.LoginButton; 


public class LoginFragment2 extends Fragment { 

private static final List<String> public_permissions = Arrays.asList("publish_actions"); 
private static final List<String> basic_permissions = Arrays.asList("email"); 
private boolean pendingPublishReauthorization = false; 
private static final String TAG = "LoginFragment2"; 
private UiLifecycleHelper uiHelper; 
App app; 
Boolean mLogged = false; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.d("LOGIN", "LoginFragment onCreate "); 
    uiHelper = new UiLifecycleHelper(getActivity(), callback); 
    uiHelper.onCreate(savedInstanceState); 
    app = ((App) getActivity().getApplication()); 
    mLogged = app.isLoggedIn(); 
    app.addHandler(mHandler); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.activity_login_activity2, container, false); 

    LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton); 
    authButton.setFragment(this); 
    authButton.setReadPermissions(basic_permissions); 

    LinearLayout login_screen = (LinearLayout) view.findViewById(R.id.login_screen); 
    RelativeLayout loading_screen = (RelativeLayout) view.findViewById(R.id.loading_screen); 

    if (app.isLoggedIn()) { 
     login_screen.setVisibility(View.GONE); 
     loading_screen.setVisibility(View.VISIBLE); 
    } else { 
     login_screen.setVisibility(View.VISIBLE); 
     loading_screen.setVisibility(View.GONE); 
    } 

    return view; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    Log.d("LOGIN", "LoginFragment onResume "); 

    if (mLogged) { 
     OpenRequest openrequest = new OpenRequest(this).setPermissions(basic_permissions); 
     // For scenarios where the main activity is launched and user 
     // session is not null, the session state change notification 
     // may not be triggered. Trigger it if it's open/closed. 
     // Session session = Session.getActiveSession(); 
     Session session = new Session(getActivity()); 
     session.openForRead(openrequest); 
     if (session != null && (session.isOpened() || session.isClosed())) { 
      onSessionStateChange(session, session.getState(), null); 
     } 

     if (session != null) { 
      // OpenRequest openrequest = new 
      // OpenRequest(this).setPermissions(basic_permissions); 
      // session.openForRead(openrequest); 
      Log.d("LOGIN", "Session!=null "); 
      Log.d("LOGIN", "Session state: " + session.getState()); 
      Log.d("LOGIN", "Session spermissions: " + session.getPermissions()); 
     } 
     // } else{ 
    } 
    Session session = Session.getActiveSession(); 
    if (session != null && 
      (session.isOpened() || session.isClosed())) { 
     onSessionStateChange(session, session.getState(), null); 
    } 

    uiHelper.onResume(); 
    // } 

} 

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

@Override 
public void onPause() { 
    super.onPause(); 
    uiHelper.onPause(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    uiHelper.onDestroy(); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    uiHelper.onSaveInstanceState(outState); 
} 

private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
    if (state.isOpened()) { 

     app.LoginApp("facebook:" + session.getAccessToken()); 
     app.setSessionFacebook(session); 
    } else if (state.isClosed()) { 
     Log.d("LOGIN", "Logged out..."); 
    } 
} 

private Session.StatusCallback callback = new Session.StatusCallback() { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     onSessionStateChange(session, state, exception); 
    } 
}; 

private MsgHandler mHandler = new MsgHandler(this); 

private MsgHandler msgHandler = new MsgHandler(this); 

private static class MsgHandler extends WeakReferenceHandler<LoginFragment2> { 
    public MsgHandler(LoginFragment2 fragment) { 
     super(fragment); 
    } 

    @Override 
    public void handleMessage(LoginFragment2 mfragment, Message msg) { 

     switch (msg.what) { 
     /**************/ 

     } 
    } 
} 

문제는 당신이 그 자체, 내가 권한을 설정하려고하므로, 그 authButton로 설정 onCreateView 방법에서 "이메일"로 : 이것은 내 LoggingFragment의 코드입니다. 그러나 로그인 할 때 세션 반환에는 "게시"권한을 포함하여 훨씬 많은 사용 권한이 있습니다. 페이스 북 지침을 따르기 때문에 내가 뭘 잘못하고 있는지 모르겠다. 그리고 그들이 말하는 것처럼 SDK를 호출한다.

누구에게이 문제가 있습니까? 무슨 일이 벌어지고 있는지에 대한 아이디어가 있습니까? 미리 감사드립니다.

아마도 사용자에게 권한을 확인하라는 대화 상자가 올바른 정보를 보여 주므로 "공개 정보, 친구 목록 및 전자 메일", 즉 기본 정보와 전자 메일, 내가 원했던 것일 수도 있습니다. 그런 다음 그 callback tat call onSessionChange가 더 많은 권한을 가진 세션을 반환합니다.

답변

0

이전에 앱 퍼블리쉬 권한을 이미 부여했다면, 그 퍼미션은 다음 세션으로 넘어갑니다. 다시 응용 프로그램이 현재 요청하고있는 초기 권한과 상관없이).

기본적으로 이전에 앱에 추가 권한을 부여 했으므로 요청하는 권한의 상위 세트가 표시됩니다.

+0

다시 설치 제거하고 설치하더라도? 그게 내가 여러 번 한 일이야. – DroidBeginner

+0

제거하면 무엇을 의미합니까? 기기에서 앱을 제거 하시겠습니까? 아니면 Facebook의 설정에서 앱을 제거 하시겠습니까? 앱에서 앱을 제거하는 중, 예를 들어, 허용 한 권한이 Facebook에 의해 서버 측에 저장되고 다음에 앱에 액세스 토큰이 주어지면 해당 토큰에는 사용자가 이전에이를 부여했습니다. 사용자가 Facebook 설정에서 앱을 제거한 경우 권한을 다시 요청해야합니다. –

+0

Ming Li, youe가 맞았습니다. 페이스 북 앱이 먼저 저장된 권한을 영원히 요청했는지 몰랐습니다. 고마워, 그 문제로 거의 일주일이 지났어. 그래서 Facebook 설정에서 권한을 삭제 했으므로 이제는 괜찮습니다. 따라서 두 번째 단계에서 public_actions로 권한을 업그레이드 할 수 있습니다. – DroidBeginner