2

私の開発環境は背後にあり、HTTPプロキシです。Androidエミュレーターでは、wifi設定でプロキシアドレスとクレデンシャルを設定できます。次に、ブラウザでページを表示すると、指定したホストの資格情報を再入力するように求められます。なぜもう一度入力する必要があるのか​​わかりませんが、機能し、ページを表示できます。

次に、同じページをロードするWebViewを備えたアプリがあります。アプリにはインターネットの許可があります:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

プラットフォーム通知をサポートします。

WebView.enablePlatformNotifications();

しかし...ページを表示しようとすると、ユーザー名とパスワードが正しく入力されていないというプロキシのエラーページが表示されます。これは、アプリがプロキシアドレスを正常に読み取っていることを示していますが、ブラウザが資格情報を読み取っていないようです。その場合、リクエストを完了する前に資格情報を要求するブラウザと同じダイアログを表示する機能がありません。

このダイアログを有効にする方法(組み込みですか?)またはプロキシの詳細を手動で指定する方法はありますか?

4

1 に答える 1

7

Android ブラウザのソース コードを見ると、次のことが明らかです。

  1. WebView は、[設定] で構成されている HTTP プロキシのホスト名とポートにアクセスできます。
  2. WebView (およびアプリ) は、[設定] で構成されている HTTP プロキシのユーザー名とパスワードにアクセスできません。
  3. WebView は、プロキシ認証要求を他の HTTP 認証要求と同様に処理し、 set toおよびset to 空の文字列onReceivedHttpAuthRequestでアタッチWebViewClientされたをトリガーします。host"{proxy}:{port}"realm
  4. ブラウザーは独自のカスタム ダイアログを使用して認証要求を処理しており、このダイアログは他のアプリには公開されていません。

そのため、Android ブラウザーからコードとダイアログ レイアウトを複製する最も簡単な方法は次のとおりです。

  1. res/layout/http_authentication.xmlを自分のプロジェクトにコピーします。
  2. src/com/android/browser/HttpAuthenticationDialog.java をコピーします
  3. 関連する文字列をres/values/strings.xmlからコピーします
  4. からメソッドを実装WebViewClientしてコピーする新しいクラスを作成します。onReceivedHttpAuthRequestcom.android.browser.Controller
  5. メソッドを に依存しないように変更しmPagesDialogHandlerます。 contextあなたの活動です。

    HttpAuthenticationDialog dialog = new HttpAuthenticationDialog(context, host, realm);
    
    dialog.setOkListener(new HttpAuthenticationDialog.OkListener() {
        public void onOk(String host, String realm, String username, String password) {
            handler.proceed(username, password);
        }
    });
    
    dialog.setCancelListener(new HttpAuthenticationDialog.CancelListener() {
        public void onCancel() {
            handler.cancel();
        }
    });
    
    dialog.show();
    
  6. WebViewClientWeb ビューには、この新しい機能を使用してください。

于 2012-06-20T20:35:05.647 に答える