2015-05-02 19 views
14

Tôi đang gặp sự cố với đăng nhập webview cho Facebook trên Android.Android Facebook SDK 4.0 Đăng nhập mà không cần Facebook App

Tôi đã làm theo hướng dẫn và đăng nhập hoạt động hoàn hảo khi người dùng đã cài đặt ứng dụng Facebook. Khi ứng dụng Facebook không được cài đặt, chế độ xem web để đăng nhập facebook bật lên; tuy nhiên, sau khi đăng nhập và chấp nhận các quyền, webview chỉ đơn giản là chuyển hướng trở lại màn hình đăng nhập. Nó không bao giờ quay trở lại ứng dụng của tôi.

Có ai khác đã gặp sự cố này không?

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(); 
       } 
      }); 

Nhìn vào nhật ký không có bộ lọc trong khi đăng nhập diễn ra, tôi thấy một vài nhật ký có thể có liên quan.

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

Chính xác bạn xác thực như thế nào? Tôi không phải là nhà phát triển Android nhưng tôi chắc chắn điều này có liên quan đến URI chuyển hướng OAuth hợp lệ của bạn. Xem https://developers.facebook.com/apps/ /settings/advanced/ –

+0

chia sẻ mã của bạn, để đăng nhập Facebook – penguin

+0

@HunterFrazier: URI chuyển hướng không hợp lệ sẽ dẫn đến thông báo lỗi _before_ người dùng có thể chấp nhận quyền. – CBroe

Trả lời

4

gì đã gây ra vấn đề là tôi đã được trọng các OnClickListener của nút đăng nhập để gọi hàm đăng nhập của LoginManager. Chỉ cần không.

+0

Tôi có nguyên nhân nhưng việc xóa @Override không hoạt động đối với tôi –

3

Với mô tả của bạn, tôi tưởng tượng rằng bạn có are not connected trên internet hay rằng bạn không xử lý các callbacks đăng nhập.

Đây là full facebook 4.0.+ login example.

Sửa Dựa trên mã của bạn:

Bạn cần phải sử dụng FacebookSdk.sdkInitialize(this);trướcsetContentView().

1

Đây là ví dụ hoạt động mà không cần sử dụng ứng dụng Facebook và nếu bạn đóng ứng dụng và mở lại ứng dụng, bạn sẽ được đăng nhập tự động trừ khi bạn đăng xuất. Dưới đây chúng tôi nhận được địa chỉ email của người dùng và danh sách bạn bè sau khi đăng nhập.

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

Tôi nghĩ bạn đã quên sử dụng callbackManager cho quy trình làm việc phù hợp. CallbackManager được sử dụng để gọi lại đăng ký phải được gọi trong onActivityResult của hoạt động lưu trữ. Hoạt động không nên ở trong singleInstance launchMode vì nó sẽ không thể khởi chạy startActivityForResult (facebook trong nội bộ khởi chạy FacebookActivity bằng cách sử dụng phương thức này). Vì vậy, hãy thêm vào hoạt động của bạn:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(requestCode, resultCode, data); 
    callbackManager.onActivityResult(requestCode, resultCode, data); 
} 
Các vấn đề liên quan