Saving External Cache Files

2019-04-15 04:37发布

I am trying to save cached webView files to a directory on the SD-card. I am using HTML5 and a cache-manifest file on the server. I set an external directory to the sd card using the setAppCachePath method but the cache is loading to the apps default 'data/data/myApp/cache/webiewCache' directory and not the directory I set using the setAppCachePath method. The external directory exists but the data is not getting to it. Any ideas or suggestions? Below is the methods I am implementing.

Thnx for the help.

public class DocumentView extends Activity {
/**
 * -- Called when the activity is first created.
 * ================================================
 **/
@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    String t = getIntent().getStringExtra("TITLE");
    activityTitle.setText(t);

    String l = getIntent().getStringExtra("LABEL");
    CreateCacheDirectory();

    String lbl = getIntent().getStringExtra("TITLE");
    pd = ProgressDialog.show(this, "" + lbl, "Retrieving data from server",
            true);

    // -- Set up the WebView ==========================================
    final String url = getIntent().getStringExtra("url");// get url that
                                                            // passed from
                                                            // previous
                                                            // Activity
    mWebView = (WebView) findViewById(R.id.webView1);
    mWebView.getSettings().setDomStorageEnabled(true);

    // Set cache size to 8 mb by default. should be more than enough
    mWebView.getSettings().setAppCacheMaxSize(1024 * 1024 * 8);
    // The DEFAULT location for the cache
    mWebView.getSettings().setAppCachePath(
            extStorageDirectory + "/myCo/myApp/cache/" + l);
    // Cache settings
    mWebView.getSettings().setAllowFileAccess(true);
    mWebView.getSettings().setAppCacheEnabled(true);
    mWebView.getSettings()
            .setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    // Misc webView settings
    mWebView.getSettings().setJavaScriptEnabled(true);

    // Check to see if there is a saved state
    if (savedInstanceState != null) {
        mWebView = (WebView) findViewById(R.id.webView1);
        mWebView.restoreState(savedInstanceState);
    } else { // If not, load the new URL from the intent bundle
        mWebView = (WebView) findViewById(R.id.webView1);
        mWebView.loadUrl(url);
        // Show the progress to the user
        mWebView.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress) {
                activity.setProgress(progress * 100);

                if (progress == 100)
                    pd.dismiss();
            }

            @Override
            // Tell the client that the Application Cache has exceeded its
            // max size
            public void onReachedMaxAppCacheSize(long spaceNeeded,
                    long totalUsedQuota,
                    WebStorage.QuotaUpdater quotaUpdater) {
                quotaUpdater.updateQuota(spaceNeeded * 2);
            }

        });
        // Set the WebViewClient that will receive various notifications and
        // requests
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onReceivedError(WebView view, int errorCode,
                    String description, String failingUrl) {
                // The redirect
                if (url.equals(failingUrl)) {
                    // error.html is the place we are redirected to by the
                    // server if we are online
                    mWebView.loadUrl("http:www.myCo/error.html");
                    return;
                } else if (url.equals(failingUrl)) { // The cache failed –
                                                        // We
                                                        // don't have an
                                                        // offline
                                                        // version to show
                    // This code removes the ugly android's
                    // "can't open page"
                    // and simply shows a dialog stating we have no network
                    view.loadData("", "text/html", "UTF-8");
                    // TODO -->showDialog(DIALOG_NONETWORK);
                }
            }

            // Set the WebViewClient that will receive various notifications
            // and requests
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
    }
    slidingDrawer();// Load the slidingDrawer
    quickAction();// Load the QuickAction Bar interface
    tableOfContenants();// Load the TOC button interface
}

1条回答
我欲成王,谁敢阻挡
2楼-- · 2019-04-15 05:25

I trying to solve the same problem, in v11 and up I've solved this by used onLoadResource to saved the url on the SD card and then shouldOverrideUrlLoading(WebView view, String url) to load the resource if we have the resource locally.

On <v11 there seems to be a no strategy I can find, when setting the cache location by setAppCachePath this is storage somewhere, but when the CacheManager is checking/loading resource from cached it always uses new File(context.getCacheDir(), "webviewCache"); which is consistent with Alex Kramers blog a link!.

Any solutions to

查看更多
登录 后发表回答