Android WebView 将 base64 url 发送到 Javascript(拒绝加载 URL,因为它超过了 X 个字符。)
Android WebView send base64 url to Javascript (Refusing to load URL as it exceeds X characters.)
我正在尝试将 base64 图像发送到 javascript,但我在 Android Studio 中一直收到此错误:
W/chromium:[警告:navigator_impl.cc(280)]拒绝加载 URL,因为它超过 2097152 个字符。
我试过使用 loadDataWithBaseURL,但我不知道如何真正做到 运行 任何 Javascript 所以我不确定这是否是一个解决方案。
这是我正在使用的代码,它适用于某些图像,但有些图像太大,它给了我错误:(
感谢您的帮助!
if (resultCode == RESULT_OK)
{
Uri selectedImage = intent.getData();
myWebView.loadUrl("javascript:setFileUri('" + selectedImage.toString() + "')");
String path = getRealPathFromURI(this, selectedImage);
//myWebView.loadUrl("javascript:setFilePath('" + path + "')");
Bitmap bm = BitmapFactory.decodeFile(path);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object
byte[] b = baos.toByteArray();
String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
myWebView.loadUrl("javascript:setFilePath('" + encodedImage + "')");
}
不知道您是否找到了这个问题的答案,但我整天都在为同样的事情苦苦挣扎,试图将图像发送到 Javascript。与您一样,loadUrl 给了我“2097152”错误,所以我尝试使用 evaluateJavascript 但一直出现 webview 语法错误。在玩弄它之后,我终于让它像这样工作了:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
try {
final String retFunction = "imageReturnFunction('data:image/png;base64," + URLEncoder.encode(encoded, "UTF-8") + "');";
runOnUiThread(new Runnable() {
public void run() {
webView.evaluateJavascript(retFunction, null);
}
});
} catch(Exception ex) {
ex.printStackTrace();
}
请注意,在我的例子中,我需要将其格式化为 dataURL(这在 JS 应用程序中很常见),但您可以根据需要调整代码。希望这有帮助。
基于 bastecklein 回答
val jsFunction = "$jsEntryPoint('data:image/jpeg;base64," +
base64String.replace("\n", "")
+"');"`
我正在尝试将 base64 图像发送到 javascript,但我在 Android Studio 中一直收到此错误:
W/chromium:[警告:navigator_impl.cc(280)]拒绝加载 URL,因为它超过 2097152 个字符。
我试过使用 loadDataWithBaseURL,但我不知道如何真正做到 运行 任何 Javascript 所以我不确定这是否是一个解决方案。
这是我正在使用的代码,它适用于某些图像,但有些图像太大,它给了我错误:(
感谢您的帮助!
if (resultCode == RESULT_OK)
{
Uri selectedImage = intent.getData();
myWebView.loadUrl("javascript:setFileUri('" + selectedImage.toString() + "')");
String path = getRealPathFromURI(this, selectedImage);
//myWebView.loadUrl("javascript:setFilePath('" + path + "')");
Bitmap bm = BitmapFactory.decodeFile(path);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object
byte[] b = baos.toByteArray();
String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
myWebView.loadUrl("javascript:setFilePath('" + encodedImage + "')");
}
不知道您是否找到了这个问题的答案,但我整天都在为同样的事情苦苦挣扎,试图将图像发送到 Javascript。与您一样,loadUrl 给了我“2097152”错误,所以我尝试使用 evaluateJavascript 但一直出现 webview 语法错误。在玩弄它之后,我终于让它像这样工作了:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
try {
final String retFunction = "imageReturnFunction('data:image/png;base64," + URLEncoder.encode(encoded, "UTF-8") + "');";
runOnUiThread(new Runnable() {
public void run() {
webView.evaluateJavascript(retFunction, null);
}
});
} catch(Exception ex) {
ex.printStackTrace();
}
请注意,在我的例子中,我需要将其格式化为 dataURL(这在 JS 应用程序中很常见),但您可以根据需要调整代码。希望这有帮助。
基于 bastecklein 回答
val jsFunction = "$jsEntryPoint('data:image/jpeg;base64," +
base64String.replace("\n", "")
+"');"`