我试图在android中使用WebView从javascript读取本地存储数据.

这是我的密码

 @Override
    public void onPageFinished(WebView view, String url) {
      getLocalStorageAndSaveOnAndroidPref("androidDeliveryAppStickyNotificationTitle", view);
    }


 public static void getLocalStorageAndSaveOnAndroidPref(String key, WebView view) {
        String JAVASCRIPT_LOCAL_STORAGE_LOOKUP = "javascript:window";
        Log.d(TAG, "getLocalStorageAndSaveOnAndroidPref: function called");
        view.evaluateJavascript(JAVASCRIPT_LOCAL_STORAGE_LOOKUP.concat(".localStorage.getItem('" + key + "')"), value -> {
            Log.d(TAG, "getLocalStorageAndSaveOnAndroidPref: "+value);
            SharePref.setDataPref(key, value);
        });
    }

但是当它第一次加载时,这给了我null.

我希望在页面第一次完成时加载本地存储数据.

你知道怎么做到吗.

推荐答案

我有一个更好的解决方案,它将首次打开WebView.

您只需使用自定义回调.这样地

public interface DataSavedCallback {
  void onDataSaved();
}
  public static void getLocalStorageAndSaveOnAndroidPref(String[] keys,
WebView view,dataSavedCallback savedCallback) {
  
    String JAVASCRIPT_LOCAL_STORAGE_LOOKUP = "javascript:window";
     view.evaluateJavascript(JAVASCRIPT_LOCAL_STORAGE_LOOKUP.concat(".localStorage.getItem('" + keys[i] + "')"), new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String value) {
                    Log.d(TAG, "getLocalStorageAndSaveOnAndroidPref: " + value);
                }
            });

    }

然后使用此函数从webview本地存储中获取密钥的值

public static void getLocalStorageAndSaveOnAndroidPref(String[] keys,
WebView view,dataSavedCallback savedCallback) {
  
    String JAVASCRIPT_LOCAL_STORAGE_LOOKUP = "javascript:window";
     view.evaluateJavascript(JAVASCRIPT_LOCAL_STORAGE_LOOKUP.concat(".localStorage.getItem('" + keys[i] + "')"), new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String value) {
                    Log.d(TAG, "getLocalStorageAndSaveOnAndroidPref: " + value);
                }
            });

    }

您可以使用webview在任何地方调用上述函数

myWebView.post(() -> {
            String[] keys = {"androidDeliveryAppStickyNotificationTitle","androidDeliveryAppStickyNotificationSubtitle","androidAppNewSoundAlertTitle"};
            getLocalStorageAndSaveOnAndroidPref(keys, myWebView, new dataSavedCallback() {
                @Override
                public void onDataSaved() {
                //do whatever you want
                }
            });

        });

Android相关问答推荐

在Jetpack Compose中,material 3 Textfield上的底部边框 colored颜色 是如何更改的?

保护所有程序包文件和类

如何将我的Android应用程序(Kotlin)中的图像分享给其他应用程序?

Jetpack Compose:带芯片的Textfield

Android v31 及更低版本中 ImageView 中的圆角

Kotlin - 在继续之前如何等待这个协程完成?

如何使用react native下载android中/data/data/[应用程序包名称文件夹]/files中的文件

在 kotlin 协同 routine 中,如何将数据范围限定为请求路径(以 MDC 为例)?

如何在这段代码android jetpack compose中实现全屏滚动

浏览器未命中断点判断 USB 连接设备

未解决的参考:pagerTabIndicatorOffset

每次在 Jetpack Compose 中调用导航

如何在 Android Jetpack compose 中为列表初始填充设置动画

如何在 Android 应用程序未激活/未聚焦时显示视图?

将应用更改为暗模式后 Android MainActivity 数据泄漏

插入查询室 OnConflictStrategy.REPLACE

并行运行两个挂起函数并在第一个返回时返回

Kotlin Compose forEach 中的负间距

Delphi 11:以编程方式查找 MSBuild 的正确工具版本

Android Studio:无法恢复密钥