介绍融合技术的几个方向,主要包括使用网页集成技术实现不同终端显示同一个网页、使用JNI开发技术实现不同平台运行同一套代码、使用局域网共享技术实现不同设备分享同一份文件。
一、网页集成
介绍融合技术的一个重要方向——网页集成,首先说明如何使用资产管理器打开文本文件、图片文件以及加载网页, 接着逐步阐述网页视图的详细用法,最后利用网页视图实现一个简单浏览器。
1.资产管理器AssetManager
res目录能够存放图片及配置信息,但不适用于下列场景:
(1)大批量需要导入数据库的初始化数据。
(2)工程源码要导出为JAR包给其他工程使用。
(3)如网页HTML这种需要保持原有格式的文件,不适合放在res目录中进行编译。
(4)其余无法被Android系统识别的文件格式,如电子书的pdf、epub、djvu等。
如何使用AssetManager
assets目录可用来保存以上特殊需求的文件,因为assets目录下的资产文件不会被系统编译,所以无法通过R.*.*这 种方式访问,需要使用资产管理器AssetManager访问。
在页面代码中调用getAssets方法可获得AssetManager对象,下面是它的常用方法说明。
list:列出指定目录下的文件与文件夹列表数组。
open:打开资产文件。
close:关闭资产管理器。
资产管理器读取文本与图像的效果
2.网页视图WebView
网页不是一般的文本文件,而是包含一系列html标签的页面描述定义,如果想显示网页的效果画面而非源代码,就 得借助于网页视图WebView。
WebView相当于Android的一个浏览器内核,可内嵌并展示Web页面,并处理App与Web的交互操作。
调用WebView对象的loadUrl方法可让网页视图显示资产目录中的网页,注意要在网页路径前加 上“file:///android_asset/”,表示该网页来自于本地的assets目录。
WebView加载资产网页的效果
给文本添加超链接
网页视图可以访问本地网页,也可以访问外部网页。
在电脑浏览器上查看网页时,经常通过点击超链接打开新窗口。
在手机上,App要实现超链接跳转,可使用可变字符串的UrlSpan风格。
UrlSpan风格把指定位置的文字转为超链接,点击超链接文字即可跳转到相应URL。超链接风格的文字效果见下图。
3.简单浏览器
下面说明WebView的常用方法。
loadUrl:加载指定的URL。
getSettings:获取浏览器的网页设置信息。
setWebViewClient:设置网页视图的网页浏览客户端WebViewClient。
setWebChromeClient:设置浏览器的网页交互客户端WebChromeClient。
canGoBack:判断页面能否返回。
goBack:返回上一个页面。
canGoForward:判断页面能否前进。
goForward:前进到下一个页面。
reload:重新加载页面。
stopLoading:停止加载页面
如何使用WebSettings
WebSettings用于管理网页视图的加载属性,指明了什么该做、什么不该做。下面是WebSettings的常用设置方法。
setLoadsImagesAutomatically:设置是否自动加载图片。
setJavaScriptEnabled:设置是否支持JavaScript。
setSupportZoom:设置是否支持页面缩放。
setBuiltInZoomControls:设置是否出现缩放工具。
setAppCacheEnabled:设置是否启用App缓存。
setAllowFileAccess:设置是否允许访问文件。
setDatabaseEnabled:设置是否启用数据库。
setDomStorageEnabled:设置是否启用本地存储。
如何使用WebViewClient
WebViewClient用于处理与加载动作有关的事件,WebView对象调用setWebViewClient方法即可设置客户端。
下面是WebViewClient需要重写的方法:
onPageStarted:页面开始加载时触发。
onPageFinished:页面加载结束时触发。
onReceivedError:收到错误信息时触发。
onReceivedSslError:收到SSL错误时触发。
shouldOverrideUrlLoading:发生网页跳转时触发。
如何使用WebChromeClient
WebChromeClient用于处理网页与App之间的交互事件,WebView对象调用setWebChromeClient方法即可 设置客户端。
下面是WebChromeClient需要重写的方法:
onReceivedTitle:收到页面标题时触发。
onProgressChanged:页面加载进度发生变化时触发。
onJsAlert:网页的JS代码调用alert方法时触发。
onJsConfirm:网页的JS代码调用confirm方法时触发。
onJsPrompt:网页的JS代码调用prompt方法时触发。
onGeolocationPermissionsShowPrompt:网页请求定位权限时触发。
简单浏览器的演示效果
二、JNI开发
介绍融合技术的一个重要方向—— JNI开发。首先说明如何在Android Studio中搭建NDK编译环境;接着阐述如何使用JNI接口完成Java代码对C代码的调用;最后描述JNI技术适用的业务场景,并给出一个实际需求的应用项目“JNI实现加解密”。
1.NDK环境搭建
完整的Android Studio开发环境包括3个开发工具包,即JDK、SDK和NDK。
NDK是C/C++代码的编译器,如果App用到JNI,就必须安装NDK。
NDK允许开发者在App中通过C/C++代码执行部分操作,然后由Java代码通过JNI接口调用C/C++代码。
Android Studio默认安装时不包含NDK,需要开发者另外安装和配置NDK。
NDK环境的搭建步骤
(1)到谷歌开发者网站下载最新的NDK开发包,下载完毕后,解压到本地路径。
(2)在系统中增加NDK的环境变量定义,如变量名为NDK_ROOT,变量值为D:\Android\android-ndk-r17。另外, 在Path变量值后面补充;%NDK_ROOT%。
(3)在项目名称上右击,然后在弹出的菜单项中选择Open Module Settings,打开设置页面,依次找到SDK Location→NDK Location,设置前面解压的NDK目录路径。
NDK安装目录的设置界面
如何给模块添加JNI支持
(1)在模块的src/main路径下创建名为jni的目录
(2)右击模块名称,在右键菜单中选择Link C++ Project with Gradle,在弹出配置页面的Build System一栏下拉 选择ndk-build,在Project Path一栏选择mk文件的路径,单击OK按钮。
(3)依次选择菜单Build→Make Module ***,执行C/C++代码的编译工作。
(4)在src/main路径下创建so库的保存目录,目录名称为jniLibs,并将生成的so文件复制到该目录下。
(5)重新运行App。
2.创建JNI接口
JNI是Java Native Interface的缩写,提供了若干API实现Java和其他语言的通信(主要是C/C++)。
虽然JNI是Java平台的标准,但是要想在Android上使用JNI,还得配合NDK才行。
NDK提供了C/C++标准库的头文件和标准库的动态链接文件(主要是.a文件和.so文件),而JNI开发只是在App工 程下编写C/C++代码。
依据build.gradle和mk文件定义的编译规则,编译生成so动态库文件,才能在App中通过Java代码调用JNI接口。
JNI开发的具体步骤
(1)确保NDK环境搭建完成,并且本模块已经添加了JNI支持。
(2)在要调用JNI接口的Activity代码中添加JNI接口定义,并在初始化时加载JNI动态库。
(3)转到工程的jni目录下,编写C/C++代码。
(4)在jni目录创建一个mk文件单独定义编译规则,并在build.gradle中指定mk文件的路径。
(5)编译JNI代码,并把编译生成的so库复制到jniLibs目录,再重新运行App。
Android.mk的编译规则
JNI方法的调用结果
3.JNI实现加解密
实际开发中,JNI主要应用于如下业务场景:
1). 对关键业务数据进行加解密 so库到目前为止是不可**的,使用JNI进行加解密更加安全。
2). 底层的网络操作与设备操作 C/C++比Java更容易驾驭底层操作。
3). 对运行效率要求较高的场合 C/C++的执行效率比Java高得多,适用于图像处理、视频处理等场合。
4). 跨平台的应用移植 采用C/C++编码, 不但Android可以通过JNI调用, iOS也能直接编译运行。
JNI实现加解密的效果
三、局域网共享
介绍融合技术的一个重要方向—— 局域网共享。首先说明如何使用无线网络管理器获取当前的WIFI信息,接着描述如何连接无线网络和开关热点,然后详细阐述蓝牙技术的4个工具组件,以及如何利用蓝牙技术实现两台设备之间的消息传递。
1.无线网络管理器WifiManager
ConnectivityManager只能笼统的判断能否上网,并不能获知WIFI连接的详细信息。
要想得知WIFI上网的具体信息,需另外通过无线网络管理器WifiManager获取。
WifiManager的对象从系统服务Context.WIFI_SERVICE中获取。
如何使用WifiManager
下面是WifiManager的常用方法。
isWifiEnabled:判断WLAN功能是否开启。
setWifiEnabled:开启或关闭WLAN功能。
getWifiState:获取当前的WIFI连接状态。
getConnectionInfo:获取当前WIFI的连接信息。
startScan:开始扫描周围的WIFI信息。
getScanResults:获取WIFI的扫描结果。
calculateSignalLevel:根据信号强度计算信号等级。
getConfiguredNetworks:获取已配置的网络信息。
addNetwork:添加指定的WIFI连接。
enableNetwork:启用指定的WIFI连接。
disableNetwork:禁用指定的WIFI连接。
disconnect:断开当前的WIFI连接。
如何获取WIFI的连接信息
getConnectionInfo方法返回一个WifiInfo对象,通过该对象的各个方法可获得更具体的WIFI设备信息。
下面是WifiInfo的信息获取方法说明。
getSSID:WIFI路由器MAC。
getRssi:WIFI信号强度。
getLinkSpeed:连接速率。
getNetworkId:WIFI的网络编号。
getIpAddress:手机的IP地址。
getMacAddress:手机的MAC地址。
获取WIFI信息的界面效果
2.连接指定WIFI
getScanResults方法可以获得WIFI的扫描结果,还要连上某个WIFI才能上网冲浪。连接某个WIFI的编码步骤如 下:
(1)首先调用startScan方法开始扫描周围WIFI。
(2)然后调用getScanResults方法获取扫描到的WIFI列表。
(3)接着通过getConfiguredNetworks方法查找已配置的网络信息。
1)如果找到指定的网络配置,则调用enableNetwork方法启用该WIFI。
2)如果没找到指定WIFI配置,则先调用addNetwork方法添加WIFI配置,再调用enableNetwork方法启用该 WIFI。
连接指定WIFI的效果
3.开关热点
Android允许手机连接外部的WIFI,反过来也支持将手机变成一个WIFI热点。其它手机接入该手机的WIFI热点,从 而共享服务端手机的数据流量。
下面是WifiManager中与热点相关的方法:
setWifiApEnabled:开启或关闭WIFI热点。
getWifiApState:获取当前的WIFI热点状态。
isWifiApEnabled:判断WIFI热点是否启用。
getWifiApConfiguration:获取WIFI热点的配置信息。
setWifiApConfiguration:设置WIFI热点的配置信息。
开启手机热点的效果
4.点对点蓝牙传输
无论是WIFI还是4G网络,建立网络连接后都是访问互联网资源,并不能直接访问局域网资源。
要想不通过服务器中转,直接把数据从A手机传给B手机,就要借助于蓝牙技术。
Android为蓝牙技术提供了4个工具类:
1). 蓝牙适配器BuletoothAdapter
2). 蓝牙设备BluetoothDevice
3). 蓝牙服务端套接字BluetoothServerSocket
4). 蓝牙客户端套接字BluetoothSocket
如何使用BuletoothAdapter
下面是BuletoothAdapter的常用方法说明。
getDefaultAdapter:静态方法,获取默认的蓝牙适配器对象。
startDiscovery:开始搜索周围的蓝牙设备。
cancelDiscovery:取消搜索操作。
getBondedDevices:获取已绑定的设备列表。
getRemoteDevice:根据蓝牙地址获取远程的蓝牙设备。
getState:获取本地蓝牙适配器的状态。
listenUsingRfcommWithServiceRecord:根据名称和UUID创建并返回BluetoothServerSocket。
listenUsingRfcommOn:根据渠道编号创建并返回BluetoothServerSocket。
如何使用BluetoothDevice
BluetoothDevice用于指代某个蓝牙设备,通常表示对方设备。而BuletoothAdapter管理的是本机的蓝牙设备。
下面是BluetoothDevice的常用方法说明。
getName:获得该设备的名称。
getAddress:获得该设备的地址。
getBondState:获得该设备的绑定状态。
createBond:创建配对请求。
createRfcommSocketToServiceRecord:根据UUID创建并返回一个BluetoothSocket。
createRfcommSocket:根据渠道编号创建并返回一个BluetoothSocket。
如何使用BluetoothServerSocket
BluetoothServerSocket是服务端的Socket,用来接收客户端的socket连接请求。
下面是BluetoothServerSocket的常用方法说明。
accept:监听外部的蓝牙连接请求。一旦有请求接入,就返回一个BluetoothSocket对象。
close:关闭服务端的蓝牙监听。
如何使用BluetoothSocket
BluetoothSocket是客户端的Socket,用于与对方设备进行数据通信。
下面是BluetoothSocket的常用方法说明。
connect:建立蓝牙的socket连接。
close:关闭蓝牙的socket连接。
getInptuStream:获取socket连接的输入流对象。
getOutputStream:获取socket连接的输出流对象。
getRemoteDevice:获取远程设备信息。
使用蓝牙传输数据的完整步骤
下面是使用蓝牙建立连接、发送消息的完整流程,主要分为以下4个步骤:
1). 开启蓝牙功能
2). 确认配对并完成绑定
3). 建立蓝牙连接
4). 通过蓝牙发送消息
蓝牙发送和接收消息的效果