这几天在AndroidStudio上利用WebView进行应用打包,期间遇到的几点问题有必要进行总结,在AS3.x上还是有一些不同,写Android SDK版本的更新带来的问题。在每个问题下可能会有相应的参考链接
,这是在探索webView过程中起到帮助作用的帖子,谢谢他们!
1、网络问题
下载包问题
下载AndroidSDK 相关文件的很耗时,网络状况不好的情况下很可能出现问题。最好就是能找有相关包的能直接拷贝过来。
Settings中配置HTTP代理
镜像服务器地址&更改hosts文件:参考:https://blog.csdn.net/cswoniu111/article/details/52187840
设置build.gradle(Project):
修改allprojects并添加:
allprojects { repositories { mavenCentral() maven { url "https://jitpack.io" } maven { url "http://maven.aliyun.com/nexus/content/groups/public/" } maven { url 'http://maven.oschina.net/content/groups/public/' } maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } maven { url "http://maven.springframework.org/release" } maven { url "http://maven.restlet.org" } maven { url "http://mirrors.ibiblio.org/maven2" } maven { url "http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories/" } maven { url 'https://maven.fabric.io/public' } jcenter() google() } }
从上述的库中选择其中一个即可,推荐aliyun的。例如:
allprojects { repositories { maven { url "http://maven.aliyun.com/nexus/content/groups/public/" } mavenCentral() jcenter() google() } }
参考:https://blog.csdn.net/u011216417/article/details/73480899
2、全屏显示
设置全屏的时候,会发生闪退,原因在于你的Activity
是否继承自AppCompatActivity
,如果是的把AppCompatActivity
改成Activity
:
public class MainActivity extends Activity
参考:https://blog.csdn.net/key_mql/article/details/70163426
3、 Webview加载url空白,但浏览器能打开
你可能会遇到这种情况,有的url能打开,有的不能。这主要和webview的缓存问题有关。
在你的代码中添加这句:
WebSettings webSettings = webView.getSettings(); webSettings.setDomStorageEnabled(true);//主要是这句 webSettings.setJavaScriptEnabled(true);//启用js webSettings.setBlockNetworkImage(false);//解决图片不显示 webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setLoadsImagesAutomatically(true); webView.setWebChromeClient(new WebChromeClient());//这行最好不要丢掉 //该方法解决的问题是打开浏览器不调用系统浏览器,直接用webview打开 webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); webView.loadUrl("http://xxx.cn");
参考:https://blog.csdn.net/u011124212/article/details/82118073?tdsourcetag=s_pctim_aiomsg
4、启动模拟器失败,缺少模拟器加速器问题
android studio 启动模拟器报错The emulator process for AVD Nexus_5X_API_22 was killed
这个问题可能是HAXM没有安装,你可以先去Android SDKManager 中进行安装:
参考:https://bbs.csdn.net/topics/392424550?page=1
5、gradle sync failed 问题
安装AS过程中常会碰到这类问题,你可以先到settings中设置你的gradle绝对路径:
参考:https://blog.csdn.net/m0_37292262/article/details/81395369
6、签名打包
在机子上安装APK时,可能会提示你安装失败,不是验证过的应用。这个时候可能是你打包时出现的问题。
通常,用签名打包是比较严格的方式:
签名:就代表着自己的版权,以后要进行升级,也必须要使用相同的签名才行。签名就代表着自己的身份(即keystore),多个app可以使用同一个签名。
我们可以通过AS进行签名打包:
参考:https://www.cnblogs.com/gao-chun/p/4891275.html
7、修改项目包名
为了方便,你可能想拷贝上一个项目,但是打包的时候却发现覆盖了上一个项目的应用。这里的问题就是在使用这个拷贝的项目时,你没有修改相应的包名。
通常分为4个步骤:
- 修改项目中build.gradle文件中的 “applicationId”;
- 修改AndroidManifest.xml文件中的 “package”,和 build.gradle 文件中的 "applicationId"保持一致;
- 重命名工程目录中的对应的 Directory;
- Sync Now一下。
参考:https://baijiahao.baidu.com/s?id=1578514127792124806&wfr=spider&for=pc
8、Android WebView加载网页失败异常处理
不同Android版本下处理不同,这里给出Android6.0+的处理方法,网上有很多处理方法,但是试过之后发现并不奏效!
@TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void onReceivedError(WebView webView, WebResourceRequest webResourceRequest, WebResourceError webResourceError) { super.onReceivedError(webView, webResourceRequest, webResourceError); if (webResourceRequest.isForMainFrame()) {//是否是为 main frame创建 view.loadUrl("about:blank");// 避免出现默认的错误界面 view.loadUrl(mErrorUrl);// 加载自定义错误页面 } }
参考:https://www.jianshu.com/p/12a011af51c4
9、原生按钮点击事件
网上的例子都不太奏效,有的说要在AndroidMainfest.xml中注册,有的使用Button定义的点击方法。
我的方式是:
- 在xml中写好Button的ID,如
<Button android:id="@+id/btnReturnMenu" //命名一个id为btnReturnMenu的Button android:layout_width="50dp" android:layout_height="50dp" android:layout_x="970dp" android:layout_y="1470px" android:background="?android:attr/colorActivatedHighlight" android:text="@string/menu_btn" android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:textColor="?android:attr/colorBackground" android:visibility="visible" android:onClick="onReturnMenu" tools:layout_editor_absoluteX="100dp" tools:layout_editor_absoluteY="164dp" />
- java文件中,定义这个Button:
private Button btnReturnMenu; btnReturnMenu = (Button)findViewById(R.id.btnReturnMenu);//找到这个ID //注册点击监听事件 btnReturnMenu.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View arg0) { { webView.loadUrl("http://118.122.250.177:18888/Commandnav/index.html"); } } });
10、判断网络是否可用
public static boolean isNetworkAvailable(Context context) { if(context!=null){ ConnectivityManager connectivity = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mNetworkInfo = connectivity.getActiveNetworkInfo(); if(mNetworkInfo!=null){ return mNetworkInfo.isAvailable(); } } return false; }
11、思考:打包一个chrome内核,优化H5的流畅度
我们经常看到微信的浏览器内核使用的时X5内核,那能不能尝试在APP中包裹一个Chrome内核呢?
这个我还没尝试过。
但是发现,X5内核在渲染图形方面,表现不佳,如canvas,极易造成卡顿,相比Chrome内核还是有差距。
参考:https://www.oschina.net/question/1176258_241816
12、Android WebView 详细
分享几篇WebView开发的文档:
Android之Android WebView常见问题及解决方案汇总
Android WebView 总结 —— 使用HTML5播放视频及全屏方案
最后分享一句在挖坑过程中遇到的一句话吧:
通往成功的路上忍得了寂寞和孤独
已经有段时间没写Blog,这一段都比较忙,下期见!