对于想了解动画SVG在AndroidWebview中不起作用的读者,本文将是一篇不可错过的文章,我们将详细介绍安卓svg动画,并且为您提供关于或都不是在iphone中动画、AndroidWebview
对于想了解动画 SVG 在 Android Webview 中不起作用的读者,本文将是一篇不可错过的文章,我们将详细介绍安卓svg动画,并且为您提供关于的有价值信息。
本文目录一览:- 动画 SVG 在 Android Webview 中不起作用(安卓svg动画)
- 或
都不是在 iphone 中动画">
- Android Webview - 调用方法 webView.loadUrl 时,chromium 会显示 ANR(带有标题)
- Android Webview -> 在 webview 的 localStorage 中设置值时未捕获的安全错误
- android webview js 交互,响应 webview 图片的响应事件
动画 SVG 在 Android Webview 中不起作用(安卓svg动画)
如何解决动画 SVG 在 Android Webview 中不起作用
我有一个 Web 应用程序,其中包含一个动画 SVG,该应用程序构建了一组面孔,每隔一秒左右添加一个新面孔。你从一张脸开始,最后得到 12 张,都在同一个 SVG 文件中。在桌面浏览器中打开该网络应用时运行良好。
当我在 Android 设备上的浏览器中或在我最终想要运行它的 WebView 中运行网络应用程序时,动画变得奇怪。第一张脸出现,然后第二张脸出现,其余的都出现了,没有面对面的堆积。
我从其他阅读资料中了解到,Android Studio 不太适合使用动画 SVG。例如,Here 是一个类似的问题,但没有回答并且已经 7 年了。
因为 SVG 嵌入在 HTML 中,所以我没有 VectorDrawable 选项,WebView 无论如何都应该正确处理 HTML+CSS+JavaScript+SVG。
我希望情况有所改善,有人对从哪里开始提出了一些建议。具体来说,是否有一些我可以添加到 AndroidManifest.xml 中的标记或一些我可以添加到 MainActivity.java 中的代码,这些代码可以使 WebView 正确呈现动画 SVG?
或
都不是在 iphone 中动画" alt="
或
都不是在 iphone 中动画">
如何解决<object type="image/svg+xml" data="images/loader.svg"> 或 <img src="images/loader.svg" alt="" /> 都不是在 iphone 中动画
我使用了两个标签,但都不适用于 iphone 意味着 svg 在 iphone 中没有动画
<object type="image/svg+xml" data="images/loader.svg">
或
<img src="images/loader.svg" alt="" />
Android Webview - 调用方法 webView.loadUrl 时,chromium 会显示 ANR(带有标题)
如何解决Android Webview - 调用方法 webView.loadUrl 时,chromium 会显示 ANR(带有标题)?
我们有一个使用 Android webview 的应用程序,我们注意到自 2021 年 4 月 7 日起调用以下代码时出现 ANR(该代码在 UIThread 中调用):
public void onLoadUrlWithHeaders(final String url,final Map<String,String> headers) {
Log.d(TAG,"onLoadUrl with headers : " + url);
webView.loadUrl(url,headers);
}
此问题是间歇性的,仅在某些设备上发生。例如在我们的测试设备上: 摩托罗拉 Moto X (4) Android 9 (SDK 28)
三星 SM - A520F Android 8 (SDK 26) - Webview Chrome 90.0.4430.82
问题出现在我们于 2020 年 12 月发布的应用版本中,该版本直到 4 月才出现上述 ANR。
ANR后A520F的/data/anr/traces.txt文件摘录
suspend all histogram: Sum: 340.474ms 99% C.I. 0.042ms-187.678ms Avg: 4.365ms Max: 283.301ms
DALVIK THREADS (69):
"Signal Catcher" daemon prio=5 tid=3 Runnable
| group="system" sCount=0 dsCount=0 flags=0 obj=0x13680248 self=0x7d302c1400
| sysTid=15932 nice=0 cgrp=default sched=0/0 handle=0x7d254fe4f0
| state=R schedstat=( 0 0 0 ) utm=2 stm=3 core=3 HZ=100
| stack=0x7d25404000-0x7d25406000 stackSize=1005KB
| held mutexes= "mutator lock"(shared held)
native: #00 pc 0000000000397510 /system/lib64/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamicns0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+212)
native: #01 pc 000000000045dce8 /system/lib64/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamicns1_11char_traitsIcEEEEbP12BacktraceMapb+348)
native: #02 pc 000000000047549c /system/lib64/libart.so (_ZN3art14DumpCheckpoint3RunEPNS_6ThreadE+880)
native: #03 pc 000000000046d774 /system/lib64/libart.so (_ZN3art10ThreadList13runcheckpointEPNS_7ClosureES2_+480)
native: #04 pc 000000000046d17c /system/lib64/libart.so (_ZN3art10ThreadList4DumpERNSt3__113basic_ostreamicns1_11char_traitsIcEEEEb+796)
native: #05 pc 000000000046cd1c /system/lib64/libart.so (_ZN3art10ThreadList14DumpForSigQuitERNSt3__113basic_ostreamicns1_11char_traitsIcEEEE+920)
native: #06 pc 00000000004426f0 /system/lib64/libart.so (_ZN3art7Runtime14DumpForSigQuitERNSt3__113basic_ostreamicns1_11char_traitsIcEEEE+196)
native: #07 pc 000000000044bb88 /system/lib64/libart.so (_ZN3art13SignalCatcher13HandleSigQuitEv+1676)
native: #08 pc 000000000044a9c0 /system/lib64/libart.so (_ZN3art13SignalCatcher3RunEPv+388)
native: #09 pc 0000000000067d04 /system/lib64/libc.so (_ZL15__pthread_startPv+200)
native: #10 pc 000000000001f348 /system/lib64/libc.so (__start_thread+68)
(no managed stack frames)
"main" prio=5 tid=1 Native
| group="main" sCount=1 dsCount=0 flags=1 obj=0x731fda50 self=0x7d302c0a00
| sysTid=15926 nice=-10 cgrp=default sched=0/0 handle=0x7d353e19c8
| state=R schedstat=( 0 0 0 ) utm=4634 stm=638 core=2 HZ=100
| stack=0x7fd505c000-0x7fd505e000 stackSize=8MB
| held mutexes=
kernel: (Couldn''t read /proc/self/task/15926/stack)
native: #00 pc 00000000035e867c /data/app/com.android.chrome-ZK4DdobzNyyzf7J8pPGLPg==/base.apk (???)
native: #01 pc 00000000033e32d8 /data/app/com.android.chrome-ZK4DdobzNyyzf7J8pPGLPg==/base.apk (???)
at J.N.MAqmDh4t(Native method)
**at org.chromium.content.browser.framehost.NavigationControllerImpl.c(chromium-Monochrome.aab-stable-443008223:17)
at org.chromium.android_webview.AwContents.w(chromium-Monochrome.aab-stable-443008223:35)
at org.chromium.android_webview.AwContents.v(chromium-Monochrome.aab-stable-443008223:14)
at com.android.webview.chromium.WebViewChromium.loadUrl(chromium-Monochrome.aab-stable-443008223:5)**
at android.webkit.WebView.loadUrl(WebView.java:927)
at br.com.gabba.Box.l.o(:-1)
at br.com.gabba.Box.model.BO.k$a.c(:-1)
at br.com.gabba.Box.model.BO.k$a.b(:-1)
at br.com.gabba.Box.model.BO.LoginAuthBO.i(:-1)
at br.com.gabba.Box.model.BO.LoginAuthBO_.H(:-1)
at br.com.gabba.Box.model.BO.LoginAuthBO_$a.run(:-1)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Here is the entire traces.txt
Similar problem in Google Mobile Ads SDK Developers
解决方法
在 Activity onDestroy 上有一个遗留代码。
@Override
protected void onDestroy() {
super.onDestroy();
WebView webView = getWebView();
if (webView != null) {
webView.setWebViewClient(null);
webView.setWebChromeClient(null);
webView.loadUrl("about:blank");
}
}
此代码可以在 webview 中的注销请求后立即执行。当响应仍在等待中时。
在某些时候,在 Chromium 更新之后,当发生这种情况时(onDestroy 带有待处理的响应),在 webView.loadUrl 的下一次执行中观察到 ANR。
我们创建一个控件来等待注销响应以完成活动。 Play 商店中注册的 ANR 数量下降了 99% 以上。或者您可以简单地从 ondestroy 中删除上述代码。
Android Webview -> 在 webview 的 localStorage 中设置值时未捕获的安全错误
如何解决Android Webview -> 在 webview 的 localStorage 中设置值时未捕获的安全错误
我需要通过在本地和会话存储中设置一些属性来在 android 中加载 webview。
我尝试在 webView.evaluateJavascript("window.localStorage.setItem(''$key'',''$val1'');",null)
的帮助下将值保存在本地/会话存储中,但出现以下错误。
未捕获的安全错误:无法从“窗口”读取“localStorage”属性:此文档的访问被拒绝。
webView.settings.javaScriptEnabled = true
webView.settings.domStorageEnabled = true
webView.settings.databaseEnabled = true
webView.settings.allowFileAccess = true
webView.settings.allowContentAccess = true
webView.evaluateJavascript("window.localStorage.setItem(''$key'',null)
webView.loadUrl("url to load")
我还在 manifest 中设置了 android:usesCleartextTraffic="true"
。
对于这个问题有什么建议吗?
解决方法
首先添加这些行
websettings.setDomStorageEnabled(true); // Turn on DOM storage
websettings.setAllowFileAccess(true); // can read the file cache
websettings.setAppCacheEnabled(true); //Enable H5 (APPCache) caching
然后
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
webView.evaluateJavascript("window.localStorage.setItem(''"+ key +"'',''"+ val +"'');",null);
} else {
webView.loadUrl("javascript:localStorage.setItem(''"+ key +"'',''"+ val +"'');");
}
android webview js 交互,响应 webview 图片的响应事件
方案思路,
1. 在点击图片的时候调用本地的 java 方法并给出响应的图片地址
2. 本地获得图片地址后,开启一个遮罩 activity 进行显示和处理
第二步的实现很容易实现,关键是第一步的实现,在网页中点击图片不会调用本地的 java 代码。那么我们需要给这个点击事件加上相应的 js 函数,让点击事件调用的 js 函数来调用我们提前准备好的 java 函数,等我们捕获到图片的 url 剩下的就好处理了。
关键点就是给普通的 html 注入我们的 js 函数,让图片能够响应点击并调用 js 函数,在通过 js 函数来调用我们的 java 函数。听起来好像有点绕,不过也不难,下面我们用代码实现下
对 java 和 js 交互还不熟悉的同学,请参照前面的文章
http://blog.csdn.net/wangtingshuai/article/details/8631835
这次实例的主要功能:点击图片在新的 activity 中展示,对图片能够进行手势操作,包括双指缩放等
效果图
加载 webview 的 activity 代码
[java] view plaincopy
package wst.webview;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {
private WebView contentWebView = null;
@SuppressLint("SetJavaScriptEnabled")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
contentWebView = (WebView) findViewById(R.id.webview);
// 启用 javascript
contentWebView.getSettings().setJavaScriptEnabled(true);
// 随便找了个带图片的网站
contentWebView.loadUrl("http://www.weim.me/12408.html");
// 添加 js 交互接口类,并起别名 imagelistner
contentWebView.addJavascriptInterface(new JavascriptInterface(this), "imagelistner");
contentWebView.setWebViewClient(new MyWebViewClient());
}
// 注入 js 函数监听
private void addImageClickListner() {
// 这段 js 函数的功能就是,遍历所有的 img 几点,并添加 onclick 函数,函数的功能是在图片点击的时候调用本地 java 接口并传递 url 过去
contentWebView.loadUrl("javascript:(function(){" +
"var objs = document.getElementsByTagName(\"img\"); " +
"for(var i=0;i<objs.length;i++) " +
"{"
+ " objs[i].onclick=function() " +
" { "
+ " window.imagelistner.openImage(this.src); " +
" } " +
"}" +
"})()");
}
// js 通信接口
public class JavascriptInterface {
private Context context;
public JavascriptInterface(Context context) {
this.context = context;
}
public void openImage(String img) {
System.out.println(img);
//
Intent intent = new Intent();
intent.putExtra("image", img);
intent.setClass(context, ShowWebImageActivity.class);
context.startActivity(intent);
System.out.println(img);
}
}
// 监听
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onPageFinished(WebView view, String url) {
view.getSettings().setJavaScriptEnabled(true);
super.onPageFinished(view, url);
// html 加载完成之后,添加监听图片的点击 js 函数
addImageClickListner();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
view.getSettings().setJavaScriptEnabled(true);
super.onPageStarted(view, url, favicon);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
}
}
}
展示图片的 activity 代码
[java] view plaincopy
package wst.webview;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import android.app.Activity;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.TextView;
public class ShowWebImageActivity extends Activity {
private TextView imageTextView = null;
private String imagePath = null;
private ZoomableImageView imageView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.show_webimage);
this.imagePath = getIntent().getStringExtra("image");
this.imageTextView = (TextView) findViewById(R.id.show_webimage_imagepath_textview);
imageTextView.setText(this.imagePath);
imageView = (ZoomableImageView) findViewById(R.id.show_webimage_imageview);
try {
imageView.setImageBitmap(((BitmapDrawable) ShowWebImageActivity.loadImageFromUrl(this.imagePath)).getBitmap());
} catch (IOException e) {
e.printStackTrace();
}
}
public static Drawable loadImageFromUrl(String url) throws IOException {
URL m = new URL(url);
InputStream i = (InputStream) m.getContent();
Drawable d = Drawable.createFromStream(i, "src");
return d;
}
}
图片布局文件
[html] view plaincopy
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- TODO 默认占位图 -->
<wst.webview.ZoomableImageView
android:id="@+id/show_webimage_imageview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="matrix"
android:src="@drawable/icon" />
<TextView
android:id="@+id/show_webimage_imagepath_textview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#ffff0000" />
</LinearLayout>
今天关于动画 SVG 在 Android Webview 中不起作用和安卓svg动画的分享就到这里,希望大家有所收获,若想了解更多关于等相关知识,可以在本站进行查询。
本文标签: