【问题标题】:How to save JavaScript generated data to a file in Android WebView如何将 JavaScript 生成的数据保存到 Android WebView 中的文件
【发布时间】:2020-11-26 00:16:40
【问题描述】:

我对 Android 非常陌生,刚刚在 Android Studio(Java 平台)中为 Android 7 及更高版本开发了一个 WebView 应用程序。 WebView 正在访问一个 HTML 页面,该页面使用 JavaScript 动态生成字符串。我可以使用这篇文章中的说明将字符串从 HTML 页面提供给 WebView:Download file generated by javascript in android webview

我想将字符串保存在文本文件中。我尝试了几个解决方案,但没有任何效果。如果有人可以提供一些代码来将字符串保存在 .txt 文件中,那将非常有帮助。我还需要有关如何实现访问存储的检查/请求权限的说明(保存文件可能需要)。

我尝试实施以下“glzlaohuai”的建议。下面是我的 MainActivity.java

package com.example.brahma;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import androidx.appcompat.app.AppCompatActivity;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class MainActivity extends AppCompatActivity {
private Context mContext;
private Activity mActivity;
private static final int MY_PERMISSION_REQUEST_CODE = 123;
WebView web;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    web = findViewById(R.id.brahma_wv);
    WebSettings webSettings = web.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setDomStorageEnabled(true);
    webSettings.setSupportZoom(true);
    webSettings.setAllowFileAccess(true);
    webSettings.supportMultipleWindows();
    webSettings.setSupportZoom(true);
    webSettings.setBuiltInZoomControls(true);
    webSettings.setDisplayZoomControls(false);
    webSettings.setAllowFileAccessFromFileURLs(true);
    webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
    web.setWebViewClient(new Callback());
    web.loadUrl("https://script.google.com/macros/s/myWebAppId/exec");
    web.addJavascriptInterface(new myJavascriptInterface(this), "Android");

}


public class myJavascriptInterface {
    Context mContext;

    myJavascriptInterface(Context c) {
        mContext = c;
    }

    @JavascriptInterface
    public void sendData(String attString) {
        File file = new File(getExternalFilesDir(null), "Testfile.txt");
        try {
            OutputStream fileWriter = new FileOutputStream(file);
            Log.d("ATT", attString);
            fileWriter.write(attString.getBytes());
            fileWriter.close();
        } catch (IOException e) {
            Log.w("ExternalStorage", "Error writing " + file, e);
        }
    }
  }
} 

代码运行,我在日志中获得了所需的字符串,但没有保存或下载文件。我也没有看到任何错误。

以下是按预期工作的修改后的代码。

public class myJavascriptInterface {
    Context mContext;

    myJavascriptInterface(Context c) {
        mContext = c;
    }

    @JavascriptInterface
    public void sendData(String attString) {
        Log.d("Txt", attString.toString());

        //save attString as file
        String filename = "TestFile.txt";
        saveTextAsFile(filename, attString);
    }
}

private void saveTextAsFile(String filename, String content) {
    File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), filename);
    try {
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(content.getBytes());
        fos.close();
        Toast.makeText(this, "Saved!", Toast.LENGTH_SHORT).show();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

【问题讨论】:

    标签: android android-studio android-webview


    【解决方案1】:

    您应该在 Java 端实现 saveTheGeneratedString(使用您喜欢的任何其他名称)方法,并在您的 javascript 代码中调用此方法,有关详细信息,请参阅此链接:@987654321 @

    关于访问存储的权限,由于您的应用面向 Android 7 及更高版本,因此不需要额外的权限,请参阅以下链接了解详细信息:

    https://developer.android.com/reference/android/content/Context#getFilesDir() https://developer.android.com/reference/android/content/Context#getExternalFilesDir(java.lang.String)

    【讨论】:

    • 我将 MainActivity.java 的代码添加到我的问题中。它正在编译,但文件没有被下载或保存。
    • 你得到了哪个日志? ATTExternalStorage
    • 来自 Log.d 的 ATT("ATT", attString)。没有关于 Log.w("ExternalStorage", "Error writing " + file, e);的日志;
    • 我建议您在创建文件实例后添加一些测试日志以查看文件是否存在。
    • 这两种方法都可以。不知道为什么你得到“方法未找到异常”,我想也许你从 javascript 端向 java 端发送了错误类型的参数,java 是一种强类型语言。关于如何在 java 中解析 JSON 格式的字符串,请阅读以下链接了解详细信息:developer.android.com/reference/org/json/JSONArraydeveloper.android.com/reference/org/json/JSONObject
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多