2015-05-02 131 views
14

我在Android上的Facebook的webview登录有问题。Android的Facebook SDK 4.0登录没有Facebook应用程序

当用户安装了Facebook应用程序时,我完全按照教程和登录作品。当未安装Facebook应用程序时,会弹出Facebook登录界面的webview;但是,登录并接受权限后,webview只会重定向回登录屏幕。它永远不会回到我的应用程序。

有其他人遇到过这个问题吗?

FacebookSdk.sdkInitialize(this); 
    profileTracker = new ProfileTracker() { 
     @Override 
     protected void onCurrentProfileChanged(Profile profile, Profile profile2) { 
      if (profile2 != null) { 
       loggedIn(profile2); 
      } else { 
       loggedOut(); 
      } 
     } 
    }; 
    accessTokenTracker = new AccessTokenTracker() { 
     @Override 
     protected void onCurrentAccessTokenChanged(AccessToken accessToken, AccessToken accessToken2) { 
      Profile.fetchProfileForCurrentAccessToken(); 
     } 
    }; 
    callbackManager = CallbackManager.Factory.create(); 
    LoginManager.getInstance().registerCallback(callbackManager, 
      new FacebookCallback<LoginResult>() { 
       @Override 
       public void onSuccess(LoginResult loginResult) { 
        // App code 
        getProfileInfo(); 
       } 

       @Override 
       public void onCancel() { 
        // App code 
        Log.e("Facebook Login", "Login Cancelled"); 
        loggedOut(); 
       } 

       @Override 
       public void onError(FacebookException exception) { 
        // App code 
        Log.e("Facebook Login", "Failed to Login " + exception.toString()); 
        loggedOut(); 
       } 
      }); 

在登录发生时查看没有过滤器的日志,我看到一些可能相关的日志。

I/chromium﹕ [INFO:CONSOLE(0)] "event.returnValue is deprecated. Please use the standard event.preventDefault() instead.", source: (0) 
I/Auth.Core﹕ [TokenCache] Missing snowballing token: no granted scopes set. 
+0

确切地说你是如何验证?我不是Android开发者,但我很确定这与您的有效OAuth重定向URI有关。请参阅https://developers.facebook.com/apps/ /settings/advanced/ –

+0

分享您的代码,用于Facebook登录 – penguin

+0

@HunterFrazier:无效的重定向URI应导致错误消息_before_用户可以已经接受权限。 – CBroe

回答

4

是什么原因导致的问题是,我是压倒一切的登录按钮的onclicklistener调用LoginManager的登录功能。不要。

+0

嘿,我得到了原因,但删除@Override不适合我 –

3

鉴于你的描述,我想象的,你要么没有连接互联网,你是不是处理登录回调上。

这是full facebook 4.0.+ login example

编辑基于您的代码:

您需要setContentView()前使用FacebookSdk.sdkInitialize(this);

1

这是一个没有使用Facebook应用程序的工作示例,如果您关闭应用程序并再次打开它,除非您注销,否则将自动登录。 在这里,我们得到了用户的电子邮件地址和好友列表登录后。

public class MainActivity extends Activity { 

    private CallbackManager callbackManager; 
    private LoginButton loginButton; 
    private static final String TAG = "logTag"; 
    private TextView mFriend, mEmail; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     FacebookSdk.sdkInitialize(getApplicationContext()); 
     callbackManager = CallbackManager.Factory.create(); 

     setContentView(R.layout.activity_main); 
     mFriend = (TextView) findViewById(R.id.tv_friend); 
     mEmail = (TextView) findViewById(R.id.tv_email); 

     loginButton = (LoginButton) findViewById(R.id.login_button); 
     loginButton.setReadPermissions(Arrays.asList("public_profile, email, user_birthday, user_friends")); 
     loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
      @Override 
      public void onSuccess(LoginResult loginResult) { 
       Log.d(TAG, "Successful Login"); 
       GraphRequest friendsRequest = GraphRequest.newMyFriendsRequest(
         loginResult.getAccessToken(), 
         new GraphRequest.GraphJSONArrayCallback() { 
          @Override 
          public void onCompleted(JSONArray objects, GraphResponse response) { 


           String x = objects.opt(0).toString(); 
           mFriend.setText(x); 

          } 
         }); 
       GraphRequest meRequest = GraphRequest.newMeRequest(
         loginResult.getAccessToken(), 
         new GraphRequest.GraphJSONObjectCallback() { 
          @Override 
          public void onCompleted(JSONObject object, GraphResponse response) { 
           try { 
            String email = response.getJSONObject().getString("email").toString(); 
            mEmail.setText(email); 
           } catch (JSONException e) { 
            e.printStackTrace(); 
           } 

          } 
         }); 

       Bundle parameters = new Bundle(); 
       parameters.putString("fields", "id, name, email, gender"); 
       meRequest.setParameters(parameters); 
       meRequest.executeAsync(); 

       parameters = new Bundle(); 
       parameters.putString("field", "user_friends"); 
       friendsRequest.setParameters(parameters); 
       friendsRequest.executeAsync(); 

      } 

      @Override 
      public void onCancel() { 
       Log.d(TAG, "Login Canceled"); 
      } 

      @Override 
      public void onError(FacebookException error) { 
       Log.d(TAG, "Login Error"); 
      } 
     }); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     super.onActivityResult(requestCode, resultCode, data); 
     // manage login results 
     callbackManager.onActivityResult(requestCode, resultCode, data); 
    } 
} 
5

我想你忘了使用callbackManager来获得正确的工作流程。必须在主机活动的onActivityResult中调用用于注册回调的CallbackManager。活动不应该在singleInstance launchMode中,因为它无法启动startActivityForResult(Facebook会使用此方法在内部启动FacebookActivity)。 因此添加到您的活动:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(requestCode, resultCode, data); 
    callbackManager.onActivityResult(requestCode, resultCode, data); 
} 
相关问题