WebView - 使用凭据的正确方法

时间:2015-12-27 13:33:28

标签: java android webview

我构建了一个密码管理应用程序。我将用户名和passowrd存储在数据库中。我想允许我的用户登录他们保存密码的网站 - 所以我使用webview。 但是,当我加载应用程序时,网站不记得我的密码,例如chrome保存您的用户名和密码并自动记住它们。 它看起来像我尝试登录的网站不记得我的凭据。 我找到了使用Google搜索API进行谷歌搜索的合适网站 - 它是动态搜索的,而非动态搜索。
我正在寻找一种自动填充密码的方法。 我该如何解决?

我的应用程序代码是这样的:

package com.example.tehem.webviewapp;

import android.net.http.SslError;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.view.Menu;
import android.view.MenuItem;

import android.webkit.HttpAuthHandler;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient;


public class MainActivity extends AppCompatActivity {

    public static final String username = "username" (read from database),
            password = "password"(read from database),
            address = "http://www.ebay.com/"(read from database, found from a search);

    WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = (WebView) findViewById(R.id.webView);


        webView.setWebViewClient(new WebViewClient() {
            public void onReceivedHttpAuthRequest(WebView view,
                                                  HttpAuthHandler handler, String host, String realm) {
                webView.setHttpAuthUsernamePassword(host, realm, username, password);
                handler.proceed(username, password);

            }
            public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed() ;
            }

        });
        webView.loadUrl(address);


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

}    

我的XML页面是这样编写的:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <WebView

        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/webView"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="181dp" />

</RelativeLayout>

当然,我允许在AndroidManifest.XML中使用互联网:

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

1 个答案:

答案 0 :(得分:0)

我不是webview小部件的专家以及如何使用它,但我知道你需要保留cookie

根据documentation,我们将使用Cookie管理器来保存浏览器Cookie。

  

CookieSyncManager用于同步浏览器Cookie存储区   RAM和永久存储之间。为了获得最佳性能,   浏览器cookie保存在RAM中。一个单独的线程保存cookie   之间,由计时器驱动。

onCreate()
    CookieSyncManager.createInstance(this);

onResume()
    CookieSyncManager.getInstance().startSync();

onPause()
    CookieSyncManager.getInstance().stopSync();

更新答案

当您定位Lollipop并且CookieSyncManager已被弃用时,根据文档我们不再需要此方法,我们可以使用方法flush()直接CookieManager

  

要手动强制同步,您可以使用CookieManager方法flush()   这是sync()

的同步替代品

所以结果将是

if (android.os.Build.VERSION.SDK_INT >= 21) {
      CookieManager.getInstance().flush();
}else {
     // use old methods 
}