Android OS の以前のリリースでは問題なく動作する WebView がありますが、Ice Cream Sandwich デバイスの読み込みに問題があります。読み込もうとしているページには BASIC AUTH が必要であり、セキュリティ以外の目的でクエリ文字列パラメーターを渡しています。
問題は WebViewClient.onReceivedHttpAuthRequest メソッドにあります。
String[] up = view.getHttpAuthUsernamePassword(host, realm);
ユーザーの ID とパスワードの代わりに null 配列を返します。これが Android ICS で異なる動作をする理由を知っている人はいますか? 他のバージョンの OS のユーザー ID とパスワードを取得します。
完全なコード:
public class DestinationWebViewScreen extends Activity{
WebView mWebView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.destination_webview);
mWebView = (WebView) findViewById(R.id.social_destination_webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setLoadsImagesAutomatically(true);
mWebView.clearCache(true);
mWebView.clearFormData();
mWebView.clearHistory();
mWebView.getSettings().setBuiltInZoomControls(true);
mWebView.setHttpAuthUsernamePassword("HOST_OF_WEBAPP","Spring Security Application", "USERID", "PASSWORD");
mWebView.setWebViewClient( new WebViewClient() {
@Override
public void onReceivedHttpAuthRequest (WebView view,
HttpAuthHandler handler, String host,String realm){
String[] up = view.getHttpAuthUsernamePassword(host, realm);
if( up != null && up.length == 2 ) {
handler.proceed(up[0], up[1]);
}
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if(progressDialog != null){
progressDialog.dismiss();
}
showProgressbar();
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
dismissProgressDialog();
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
dismissProgressDialog();
}
});
mWebView.loadUrl("https://webapphost/webapp?customerId=0-222293");
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(networkStateReceiver, filter);
}
public void showProgressbar() {
progressDialog = new CustomProgressDialog(SocialDestinationWebViewScreen.this);
progressDialog.getWindow().setBackgroundDrawable(getResources().getDrawable(android.R.color.transparent));
progressDialog.setMessage(SocialDestinationWebViewScreen.this.getResources().getString(R.string.loading));
progressDialog.show();
}
void dismissProgressDialog(){
if(progressDialog != null){
progressDialog.dismiss();
}
progressDialog = null;
}
}