2013-03-22 20 views
10

Tôi đã bị kẹt trong điều này hàng giờ vì điều này đã hoạt động trước đó nhưng đột nhiên dừng lại để hoạt động như mong đợi. Tôi không thực sự biết làm thế nào và tại sao như tôi đã kiểm tra lại tất cả các dòng mã trong quá trình mà không thể nhìn thấy những gì sai vì vậy tôi yêu cầu các bạn giúp đỡ.Kết quả lược đồ OAuth và tùy chỉnh trong một "ERR_UNKNOWN_URL_SCHEME" trong Chrome

Được rồi. Vì vậy, tôi đã thực hiện hoạt động LoginScreen bằng một nút bắt đầu từ Intent.ACTION_VIEW mới khi nhấp. Điều này bắt đầu quá trình OAUTH trong trình duyệt với ApiManager.OAUTH_CALLBACK_URI được đặt thành stjapp://oauthresponse.

Dưới đây là AndroidManifest.xml một phần của tôi cho hoạt động này:

<activity 
    android:name=".LoginScreen" 
    android:label="@string/application" 
    android:launchMode="singleTask"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <data android:scheme="stjapp" android:host="oauthresponse" /> 
    </intent-filter> 
</activity> 

Làm thế nào tôi bắt đầu Intent.ACTION_VIEW trong hoạt động của tôi:

private View.OnClickListener loginHandler = new View.OnClickListener() { 
     public void onClick(View v) { 
      OAuthClientRequest request = null; 
      try { 
       request = OAuthClientRequest 
        .authorizationLocation(ApiManager.OAUTH_AUTHORIZE) 
        .setClientId(ApiManager.CLIENT_ID).setRedirectURI(ApiManager.OAUTH_CALLBACK_URI) 
        .buildQueryMessage(); 
      } 
      catch (OAuthSystemException e) { e.printStackTrace(); } 
      Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(request.getLocationUri() + "&response_type=code")); 
      startActivity(intent); 
     } 
    }; 

Và đây là một ảnh chụp màn hình của những gì xảy ra trong trình duyệt:

enter image description here

Ở đó, tôi phải quay lại hoạt động LoginScreen và xử lý các tham số truy vấn code trong phương thức onNewIntent nhưng ... vâng, điều này không hoạt động như mong đợi nữa.

Bất kỳ trợ giúp nào được đánh giá cao.

+0

Mọi thứ hoạt động như mong đợi sẽ mở liên kết bằng trình duyệt tích hợp của Android. Bắt đầu cảm thấy như tôi sẽ phải sử dụng một 'WebView' nội bộ thay vì để cho phần này của quá trình OAuth bên ngoài. Có suy nghĩ gì không? – kytwb

Trả lời

6

Có vẻ như đây là Chromium bug. Cách giải quyết Tôi đang sử dụng là một trang PHP đích cho RedirectURI mở ra các ứng dụng thông qua JavaScript (mà không bị ảnh hưởng bởi lỗi đó):

<script language="javascript"> 
    window.location = 'myscheme://myhost/?<?=$_SERVER["QUERY_STRING"]?>'; 
</script> 
+0

Tôi đánh dấu là câu trả lời được chấp nhận khi bạn liên kết với vấn đề liên quan đến crôm. Tôi sẽ xem lựa chọn thay thế nào phù hợp với nhu cầu của tôi. Cảm ơn! – kytwb

+0

@Kyotoweb rất vui được giúp đỡ! – domsom

4

tôi đã có lỗi tương tự và giải quyết nó bằng cách đặt trước các url với http://.

2

Trong phiên bản Chrome 40 trở lên, lỗi này đã được tạo lại, nhưng chỉ khi bạn nhập thủ công URL của trang chuyển hướng trong thanh địa chỉ. Vấn đề là trên trình theo dõi vấn đề chromium here.

Các phản ứng với "workaround", dán từ vấn đề:

OK, tôi đã phát hiện ra rằng window.location chuyển hướng qua ý định sẽ công việc, miễn là nó được nhấp từ nguồn hoặc liên kết bên ngoài trên trang . Nếu bạn nhập thủ công địa chỉ của trang chuyển hướng vào thanh địa chỉ , việc chuyển hướng/mở ứng dụng sẽ không thành công với lỗi được cho biết.

Vì vậy, việc gửi liên kết tới trang chuyển hướng trong email hoặc SMS sẽ hoạt động tốt khi người dùng nhấp vào liên kết. Nhập thủ công địa chỉ vào thanh địa chỉ sẽ không thành công. window.location = chromeUrl; nên chỉ hoạt động tốt.

1

chỉ khi bạn nhập thủ công URL của trang chuyển hướng trong thanh địa chỉ. Vấn đề là trên trình theo dõi vấn đề chromium ở đây.

Các phản ứng với "workaround", dán từ vấn đề:

OK, tôi đã phát hiện ra rằng window.location chuyển hướng qua ý định sẽ làm việc, miễn là nó được nhấp từ một nguồn bên ngoài hoặc liên kết trên trang. Nếu bạn nhập thủ công địa chỉ của trang chuyển hướng vào thanh địa chỉ, việc chuyển hướng/mở ứng dụng sẽ không thành công với lỗi đã nêu.

Vì vậy, việc gửi liên kết tới trang chuyển hướng trong email hoặc SMS sẽ hoạt động tốt khi người dùng nhấp vào liên kết. Nhập thủ công địa chỉ vào thanh địa chỉ sẽ không thành công. window.location = chromeUrl; nên làm việc tốt.