介绍融合技术的几个方向,主要包括使用网页集成技术实现不同终端显示同一个网页、使用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:关闭资产管理器。

资产管理器读取文本与图像的效果

android 融合技术(十六)

2.网页视图WebView

          网页不是一般的文本文件,而是包含一系列html标签的页面描述定义,如果想显示网页的效果画面而非源代码,就               得借助于网页视图WebView。

           WebView相当于Android的一个浏览器内核,可内嵌并展示Web页面,并处理App与Web的交互操作。

          调用WebView对象的loadUrl方法可让网页视图显示资产目录中的网页,注意要在网页路径前加                                               上“file:///android_asset/”,表示该网页来自于本地的assets目录。

WebView加载资产网页的效果

android 融合技术(十六)

给文本添加超链接

           网页视图可以访问本地网页,也可以访问外部网页。

           在电脑浏览器上查看网页时,经常通过点击超链接打开新窗口。

           在手机上,App要实现超链接跳转,可使用可变字符串的UrlSpan风格。

         UrlSpan风格把指定位置的文字转为超链接,点击超链接文字即可跳转到相应URL。超链接风格的文字效果见下图。

android 融合技术(十六)

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:网页请求定位权限时触发。

简单浏览器的演示效果

android 融合技术(十六)

二、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安装目录的设置界面

android 融合技术(十六)

如何给模块添加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的编译规则

android 融合技术(十六)

JNI方法的调用结果

android 融合技术(十六)

3.JNI实现加解密

          实际开发中,JNI主要应用于如下业务场景:

          1). 对关键业务数据进行加解密 so库到目前为止是不可**的,使用JNI进行加解密更加安全。

          2). 底层的网络操作与设备操作 C/C++比Java更容易驾驭底层操作。

          3). 对运行效率要求较高的场合 C/C++的执行效率比Java高得多,适用于图像处理、视频处理等场合。

          4). 跨平台的应用移植 采用C/C++编码, 不但Android可以通过JNI调用, iOS也能直接编译运行。

JNI实现加解密的效果

android 融合技术(十六)

三、局域网共享

      介绍融合技术的一个重要方向—— 局域网共享。首先说明如何使用无线网络管理器获取当前的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信息的界面效果

android 融合技术(十六)

2.连接指定WIFI

           getScanResults方法可以获得WIFI的扫描结果,还要连上某个WIFI才能上网冲浪。连接某个WIFI的编码步骤如                     下:

        (1)首先调用startScan方法开始扫描周围WIFI。

        (2)然后调用getScanResults方法获取扫描到的WIFI列表。

         (3)接着通过getConfiguredNetworks方法查找已配置的网络信息。

                      1)如果找到指定的网络配置,则调用enableNetwork方法启用该WIFI。

                      2)如果没找到指定WIFI配置,则先调用addNetwork方法添加WIFI配置,再调用enableNetwork方法启用该                             WIFI。

连接指定WIFI的效果

android 融合技术(十六)

3.开关热点

          Android允许手机连接外部的WIFI,反过来也支持将手机变成一个WIFI热点。其它手机接入该手机的WIFI热点,从               而共享服务端手机的数据流量。

      下面是WifiManager中与热点相关的方法:

              setWifiApEnabled:开启或关闭WIFI热点。

              getWifiApState:获取当前的WIFI热点状态。

              isWifiApEnabled:判断WIFI热点是否启用。

              getWifiApConfiguration:获取WIFI热点的配置信息。

              setWifiApConfiguration:设置WIFI热点的配置信息。

开启手机热点的效果

android 融合技术(十六)

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). 通过蓝牙发送消息

蓝牙发送和接收消息的效果

android 融合技术(十六)

 

 

 

 

 

相关文章: