2013-08-24 36 views
5

Tôi đang phát triển một ứng dụng Android tích hợp với facebook. Các ứng dụng hoạt động hoàn toàn tốt đẹp khi tôi đặt LoginButton.setLoginBehavior (SessionLoginBehavior.SUPPRESS_SSO).SSO (Singe Sign-On) không hoạt động khi ứng dụng Facebook được cài đặt trên thiết bị

Sự cố phát sinh khi tôi cố gắng sử dụng SSO. Tôi nhận được lỗi dưới đây. Tôi sử dụng để có được một lỗi tương tự khi tôi sử dụng một keyhash không chính xác; đây không phải là trường hợp nữa vì nhật ký Webview hoạt động tốt. Sự kiện đáng ngạc nhiên hơn là ứng dụng Android hoạt động nếu ứng dụng được cài đặt trong FB. Ví dụ, tôi là người quản lý ứng dụng do đó nó được cài đặt trong hồ sơ facebook của tôi theo mặc định, nhưng khi tôi thử với một tài khoản fb khác mà không cài đặt ứng dụng thì nó không hoạt động. Khi tôi cố gắng đăng nhập vào lỗi dưới đây xuất hiện và tôi nhận được một hộp thoại nói với tôi rằng quyền cơ bản sẽ được cấp, nhưng trong thực tế tôi thậm chí không nhận được quyền cơ bản.

Tôi đã gửi ứng dụng để xem xét để hiển thị ứng dụng trên Trung tâm ứng dụng. Khi tôi làm điều đó, hộp thoại sẽ hiển thị hộp kiểm nơi tôi xác nhận rằng ứng dụng của tôi sử dụng SSO. Facebook có cần phê duyệt ứng dụng của tôi trước khi tôi có thể sử dụng SSO (nếu có, điều này không có ý nghĩa)

Tôi đã bỏ ra hàng giờ để giải quyết vấn đề này và tôi không thể tìm ra giải pháp. Hãy giúp tôi.

08-24 01:39:16.058: W/Bundle(21880): Key com.facebook.platform.protocol.PROTOCOL_VERSION expected String but value was a java.lang.Integer. The default value <null> was returned. 
08-24 01:39:16.068: W/Bundle(21880): Attempt to cast generated internal exception: 
08-24 01:39:16.068: W/Bundle(21880): java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 
08-24 01:39:16.068: W/Bundle(21880): at android.os.Bundle.getString(Bundle.java:1069) 
08-24 01:39:16.068: W/Bundle(21880): at android.content.Intent.getStringExtra(Intent.java:4350) 
08-24 01:39:16.068: W/Bundle(21880): at com.facebook.AuthorizationClient$KatanaLoginDialogAuthHandler.tryAuthorize(AuthorizationClient.java:821) 
08-24 01:39:16.068: W/Bundle(21880): at com.facebook.AuthorizationClient.tryCurrentHandler(AuthorizationClient.java:272) 
08-24 01:39:16.068: W/Bundle(21880): at com.facebook.AuthorizationClient.tryNextHandler(AuthorizationClient.java:238) 
08-24 01:39:16.068: W/Bundle(21880): at com.facebook.AuthorizationClient$GetTokenAuthHandler.getTokenCompleted(AuthorizationClient.java:772) 
08-24 01:39:16.068: W/Bundle(21880): at com.facebook.AuthorizationClient$GetTokenAuthHandler$1.completed(AuthorizationClient.java:731) 
08-24 01:39:16.068: W/Bundle(21880): at com.facebook.internal.PlatformServiceClient.callback(PlatformServiceClient.java:144) 
08-24 01:39:16.068: W/Bundle(21880): at com.facebook.internal.PlatformServiceClient.handleMessage(PlatformServiceClient.java:128) 
08-24 01:39:16.068: W/Bundle(21880): at com.facebook.internal.PlatformServiceClient$1.handleMessage(PlatformServiceClient.java:54) 
08-24 01:39:16.068: W/Bundle(21880): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-24 01:39:16.068: W/Bundle(21880): at android.os.Looper.loop(Looper.java:137) 
08-24 01:39:16.068: W/Bundle(21880): at android.app.ActivityThread.main(ActivityThread.java:5227) 
08-24 01:39:16.068: W/Bundle(21880): at java.lang.reflect.Method.invokeNative(Native Method) 
08-24 01:39:16.068: W/Bundle(21880): at java.lang.reflect.Method.invoke(Method.java:511) 
08-24 01:39:16.068: W/Bundle(21880): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
08-24 01:39:16.068: W/Bundle(21880): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
08-24 01:39:16.068: W/Bundle(21880): at dalvik.system.NativeStart.main(Native Method) 
+0

Trong khi ClassCastException chắc chắn là không tốt, tôi không nghĩ rằng đó là nguyên nhân của các vấn đề của bạn. Bạn có thể thấy nếu có bất kỳ ngoại lệ nào được trả lại trong Session.StatusCallback của bạn không? –

+0

ClassCastException được ném bởi SDK Facebook vì có một số cuộc gọi sẽ trả về một Chuỗi (có thể một số khóa Auth) khi ứng dụng kết nối đúng và không phải là Số nguyên. – Emmanuel

+0

Tôi hiểu điều đó, nhưng nó cũng không gây ra sự cố đăng nhập thực tế với ứng dụng mẫu hoặc toàn bộ người khác hiện đang ở trên 3,5, vì vậy giả thuyết của tôi là có các vấn đề khác khiến ứng dụng của bạn không thể đăng nhập Bạn có thể vui lòng kiểm tra xem có bất kỳ ngoại lệ nào được chuyển đến StatusCallback của bạn không? –

Trả lời

16

Tôi có một kết quả logcat tương tự và phát hiện ra rằng nó có liên quan đến tính không chính xác trong mã nguồn FB 3.5. Như được mô tả ở trên, nó nằm trên dòng 821 trong AuthorizationClient.java. Phải có getIntExtra thay vì getStringExtra. Tải nguồn từ github và thay đổi

intent.getStringExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION)); 

để

""+intent.getIntExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION, 0)); 
+0

Sẽ thực hiện. Cảm ơn – Emmanuel

+0

đã làm việc cho tôi nhờ –

+0

Không có mã như vậy trong 3.5.2. Bạn đang sử dụng phiên bản nào? – jul

3

Vấn đề là hashkey là wong

Đối với Linux

Mở Terminal:

Đối gỡ lỗi Build

keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64 

bạn wil tìm debug.keystore từ thư mục ".android" sao chép nó từ và dán trên desktop và chạy trên lệnh

Đối với phiên bản Build

keytool -exportcert -alias <aliasName> -keystore <keystoreFilePath> | openssl sha1 -binary | openssl base64 

Chú ý: Hãy chắc chắn rằng trong cả hai trường hợp đó phải yêu cầu mật khẩu. Nếu nó không yêu cầu mật khẩu, điều đó có nghĩa là có điều gì đó sai.

+0

Hàm băm chính xác. Phương pháp bạn đề xuất không phải lúc nào cũng hoạt động. Nó là tốt hơn để làm điều đó thông qua mã hoặc bằng cách sao chép nó vào tập tin .txt trong một số bước như nó được thực hiện ở đây http://stackoverflow.com/questions/5306009/facebook-android-generate-key-hash/12405323#12405323 – Emmanuel

0

Tôi không chắc liệu điều này có hữu ích hay không, nhưng nó có thể liên quan đến bản phát hành SDK mới. Bạn đang sử dụng Android SDK SDK v3.5? Có thể thử sử dụng phiên bản cũ hơn của SDK, 3.0.2, bạn có thể tìm thấy phiên bản đó bằng cách duyệt số github repository của họ.

Edit:

tôi đã khắc phục các vấn đề trong trường hợp của tôi, nhưng không thể nói tôi biết những gì các vấn đề thực tế là:

  • Kiểm tra băm và APP_ID của bạn, hãy chắc chắn bạn thêm khóa băm vào ứng dụng của bạn trên trang web của nhà phát triển thay vì ứng dụng mẫu.

  • Hãy chắc chắn rằng Manifest của bạn bao gồm hoạt động này một cách chính xác theo quy định/xuất hiện trong các mẫu

    hoạt động android: name = "com.facebook.LoginActivity" android: theme = "@ android: phong cách/Theme.Translucent.NoTitleBar"
    android: label = "@ string/app_name"

  • Hãy chắc chắn rằng bạn thêm siêu dữ liệu trong ứng dụng <> tag của Manifest

    meta-data Android của bạn: name = "com.facebook.sdk.ApplicationId" android: value = "@ string/app_id"

  • Hãy chắc chắn rằng các nhà phát triển Facebook tài khoản, ứng dụng mà bạn đang triển khai chỉ định gói chính xác và tên lớp chính

  • tôi cũng loại bỏ các thuộc tính sau từ hoạt động đăng nhập chính của tôi trong biểu hiện:

    android: xuất khẩu = "true" android: noHistory = "true"

Đây là những gì tôi đã làm và nó có vẻ làm việc cho bây giờ, tôi không thể nói nếu đây là một sửa chữa phổ quát nhưng ít nhất nó là giá trị kiểm tra rằng tất cả những người là chính xác.

+0

Tôi đang sử dụng 3.5. Tôi nghĩ rằng nó cũng không hoạt động ở 3.0.2. Tôi sẽ cho nó nó một cơ hội. – Emmanuel

+0

Vẫn không hoạt động ... – Emmanuel

+0

Vâng, tôi đang gặp vấn đề tương tự, không thực sự biết đường nào để theo đuổi để tìm cách khắc phục. Tôi sử dụng hai máy riêng biệt để triển khai ứng dụng tôi đang thực hiện. Điều kỳ lạ là từ một máy nó hoạt động (tôi không nhận được các cảnh báo) trong khi từ một máy khác thì không, và ứng dụng bị treo. Tôi nghĩ đó là vấn đề với chứng chỉ/chữ ký/khóa băm. –

0

Thực tế là đăng nhập qua các công trình WebView không có nghĩa là mã băm đúng, vì nó hoạt động ngay cả khi không có hàm băm trong cài đặt ứng dụng Facebook. Vì vậy, hãy kiểm tra kỹ hashkey của bạn. Bên cạnh đó vì bạn nói rằng nó chỉ hoạt động với hồ sơ của bạn chứ không phải với những người khác, hãy kiểm tra xem bạn đã thêm chúng một cách chính xác làm người thử nghiệm hay không bạn đang ở chế độ Hộp cát.

+0

Tôi sẽ kiểm tra lại mã băm và cho bạn biết. Tôi không ở chế độ Sandbox. Lý do tại sao chỉ có tôi không có vấn đề khi tôi đăng nhập là bởi vì các ứng dụng được thêm vào bởi hồ sơ facebook khi tôi tạo ra nó. Sicne ứng dụng dường như không xác thực, tôi không cài đặt ứng dụng vào facebook của người dùng ... – Emmanuel

3

Ok, đây là những gì đã xảy ra. Trên onCreate() của tôi, tôi đã chuyển quyền "create_event" và "publication_actions" cho LoginButton của mình. Tôi đã đi trước và thiết lập một onErrorListener trên LoginButton và tôi đã nhận được này:

08-28 14:06:01.679: E/FACEBOOK LOGIN ERROR(28293): UnknownError: The app must ask for a basic_info permission at install time. 

Khi nó quay ra, khi cài đặt, ứng dụng của bạn HAS để yêu cầu quyền đọc đầu tiên, và một khi bạn đã đăng nhập bạn có thể yêu cầu quyền xuất bản. Here là cách facebook giải thích nó (theo Quyền xuất bản):

Ứng dụng phải tách yêu cầu quyền đọc và xuất bản. Lập kế hoạch ứng dụng của bạn xung quanh yêu cầu quyền đọc tối thiểu khi đăng nhập ban đầu và sau đó bất kỳ quyền xuất bản nào khi một người thực sự cần chúng, ví dụ như khi họ muốn tạo Câu chuyện biểu đồ mở từ bên trong ứng dụng. Điều này mang lại trải nghiệm tốt nhất cho người dùng và tối ưu hóa chuyển đổi.

Bạn có thể nhận được Cảnh báo dành cho nhà phát triển nếu ứng dụng của bạn yêu cầu đọc và xuất bản quyền cho phép. Để ngừng nhận các cảnh báo này, hãy tách riêng các yêu cầu của bạn hoặc thực hiện theo các nguyên tắc bên dưới để biết các trường hợp đặc biệt .

Trong trường hợp hiếm hoi, ứng dụng của bạn yêu cầu quyền xuất bản lên phía trước (ví dụ: ứng dụng không làm gì ngoài việc xuất bản tâm trạng của người dùng thành Facebook), trước tiên yêu cầu quyền đọc tối thiểu lúc đăng nhập ban đầu. Sau khi người dùng đăng nhập bằng Facebook, hãy hiển thị cho người dùng màn hình giải thích lý do ứng dụng của bạn cần quyền xuất bản và cho phép người dùng chọn tham gia yêu cầu cấp phép xuất bản bằng cách nhấp vào nút. Điều này sẽ cung cấp cho người dùng nhiều ngữ cảnh hơn và cải thiện chuyển đổi của bạn.

Một trường hợp hợp lệ khác để yêu cầu quyền đọc và xuất bản lại là dành cho người dùng đăng nhập vào ứng dụng của bạn với tùy chọn đăng nhập email hoặc tùy chọn đăng nhập không phải Facebook. Khi những người dùng này muốn xuất bản lên Facebook, ứng dụng của bạn sẽ cần phải yêu cầu quyền đọc để kết nối tài khoản của họ theo sau bằng cách xuất bản quyền sao lưu. Trong trường hợp này, hãy đảm bảo rằng các quyền chỉ đọc mà bạn yêu cầu là danh sách bạn bè và hồ sơ công khai . Điều này mang lại trải nghiệm người dùng tốt nhất vì người dùng muốn chỉ xuất bản từ ứng dụng của bạn và không phải là quan tâm đến việc cung cấp quyền đọc bổ sung. Nó cũng sẽ cải thiện chuyển đổi của bạn.

Để giải quyết vấn đề của tôi, tôi chỉ không yêu cầu bất kỳ điều khoản khi khởi động (bạn sẽ có được "basic_info" quyền đọc theo mặc định), và sau đó tôi sử dụng

helper = new UiLifecycleHelper(this, new StatusCallback() { 

      @Override 
      public void call(Session session, SessionState state, Exception exception) { 
       // TODO Auto-generated method stub 
       if(state.isOpened()&&!session.getPermissions().contains("publish_actions")) 
        session.requestNewPublishPermissions(new NewPermissionsRequest(SplashScreen.this, "publish_actions")); 

      } 
     }); 

trong onCreate (). Vì call() được gọi bất cứ khi nào có một sự thay đổi trong Session, session.isOpen() sẽ là true, nếu chúng ta không kiểm tra nếu sự cho phép được thiết lập, chúng ta sẽ nhập vào một vòng lặp vô hạn.

Dường như, cảnh báo trên không liên quan đến lỗi thực tế. Cũng giống như một gợi ý, những người có vấn đề như thế này, thiết lập onErrorListener và Log nó.

Log.e("FACEBOOK LOGIN ERROR", error.getLocalizedMessage()); 
Các vấn đề liên quan