2015-09-27 15 views
10

Tôi đang sử dụng Facebook SDK (4. *) trên Android. Chỉ cần thực hiện đăng nhập theo chương trình (không sử dụng "LoginButton") sử dụng LoginManager 's logInWithReadPermissions(). Để gọi lại hoạt động, tôi cần gọi số FacebookCallbackManager.onActivityResult(requestCode, resultCode, data); mà tôi thực hiện trong phương thức onActivityResult của hoạt động của mình.Mã yêu cầu liên tục ở đâu (64206) để đăng nhập được xác định trong Facebook SDK

Tuy nhiên, số onActivityResult xử lý kết quả của mình tạo thành một số hoạt động trả lại và kiểm tra các hoạt động requestCode để xem hoạt động nào được trả lại. Tôi thấy rằng đăng nhập facebook trở về với 64206 nhưng tôi không thể tìm thấy nơi mà hằng số được xác định. Tôi không muốn hardcode 64206 và tôi đã tự hỏi: không ai biết mã kết quả này được xác định trong SDK Facebook ở đâu (và nó là công khai)?

+0

mã yêu cầu '64206' chỉ đơn giản là' 0xface'. Kiểm tra câu trả lời dưới đây. –

+0

Tương tự, mã yêu cầu '64207' là' CallbackManagerImpl.RequestCodeOffset.Share.toRequestCode() '. –

Trả lời

21

Vì vậy, sau khi tất cả, tôi quyết định đào sâu với trình gỡ rối và tìm thấy nó trong Facebook SDK. Mã yêu cầu được xác định trong CallbackManagerImpl.RequestCodeOffset.

Bạn có thể nhận mã yêu cầu đăng nhập với điều này: CallbackManagerImpl.RequestCodeOffset.Login.toRequestCode().

Ngoài ra còn bạn sẽ tìm thấy mã cho Share, Message, Like, GameRequest, AppGroupCreate, AppGroupJoin, AppInvite.

3

Bạn không thực sự phải quan tâm đến giá trị thực tế của mã yêu cầu được sử dụng nội bộ của Facebook, do kết quả của CallbackManager.onActivityResult(requestCode, resultCode, data) sẽ cho bạn biết liệu nó có được xử lý hay không. Tức là, trước tiên hãy cung cấp kết quả cho số CallbackManager. Nếu nó cho biết nó đã được xử lý, bạn đã hoàn tất. Nếu nó không được xử lý, nó là một trong các kết quả của mã yêu cầu khác của bạn, do đó, chỉ cần tiếp tục với logic bạn đã có sẵn.

Từ docs on CallbackManager:

/** 
* The method that should be called from the Activity's or Fragment's onActivityResult method. 
* @param requestCode The request code that's received by the Activity or Fragment. 
* @param resultCode The result code that's received by the Activity or Fragment. 
* @param data  The result data that's received by the Activity or Fragment. 
* @return true If the result could be handled. 
*/ 
public boolean onActivityResult(int requestCode, int resultCode, Intent data); 

Lưu ý @return nhận xét.

Vì vậy, về cơ bản, mã của bạn nên được cấu trúc hơi như thế này:

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    boolean handled = callbackManager.onActivityResult(requestCode, resultCode, data); 
    if (handled) { /* all done */ } 
    else { /* result wasn't handled by the callback manager, so check for other potential request codes */ } 
} 

Nếu bạn thực sự muốn, bạn có thể lặn vào nguồn Facebook SDK để truy nguyên nguồn gốc của mã yêu cầu. Cụ thể, hãy tham khảo CallbackManagerImpl, trong đó các cuộc gọi lại tĩnh được thiết lập với mã bù yêu cầu được xác định trước.

+2

Có hai vấn đề với cách tiếp cận này: 1. Vấn đề lớn hơn: Tôi không muốn gọi mã bên ngoài với kết quả 'Intent data' (có thể) chứa thông tin nhạy cảm. 2. Vấn đề nhỏ hơn: nó không hiệu quả (và nó lộn xộn). Điều gì sẽ xảy ra nếu tôi phải gọi một vài trình xử lý onActivityResult bên ngoài mỗi lần, ví dụ: nếu tôi sử dụng một số libs bên ngoài ... – Ognyan

+0

@Ogre_BGR: 1. Sau đó, chỉ cần đảo ngược if-else, vì vậy bạn không tìm được người khác nếu có 'trường hợp dữ liệu nhạy cảm' (nếu đó thực sự là những gì bạn lo lắng về, bạn không nên sử dụng * bất kỳ * thư viện mặc dù, do đó, một chút của một điểm tranh luận). 2. Chủ quan lúc tốt nhất.Bạn nói lộn xộn, ai đó khác có thể tranh luận ngược lại vì kết quả được xử lý trong bối cảnh yêu cầu của nó bị sa thải. Cũng phụ thuộc vào cách bạn xác định hiệu quả: có một trình xử lý chuyên dụng là một cách tiếp cận dễ dàng để tránh trùng lặp mã. Dù sao, cuối cùng nó tùy thuộc vào bạn. Tất cả những gì tôi làm là cung cấp một giải pháp hợp lý cho vấn đề của bạn. :) –

+0

Có, đó là chủ quan nhưng tôi có xu hướng hút về phía so sánh mã yêu cầu rõ ràng. Có một điều làm phiền tôi với giải pháp mà tôi cung cấp trong câu trả lời cho câu hỏi của mình là 'RequestCodeOffset' được lồng trong' CallbackManagerImpl' và nếu facebook quyết định cung cấp 'CallbackManager' mới, chúng có thể không dùng' CallbackManagerImpl' và mã của tôi sẽ phải được thay đổi (nhưng trong trường hợp của FB chúng tôi bị máng này nhiều lần đã được như vậy không có vấn đề lớn :-)). – Ognyan

4

Better cách là gọi FacebookSdk.getCallbackRequestCodeOffset()

+4

Sau khi kiểm tra FacebookSdk, tôi thấy có một phương thức boolean isFacebookRequestCode (int requestCode). – dabicho

Các vấn đề liên quan