当前位置:文档之家› Android webkit简介及开发遇到的一些问题

Android webkit简介及开发遇到的一些问题

Android webkit简介及开发遇到的一些问题
Android webkit简介及开发遇到的一些问题

Android webkit简介

张立鹏

M厂开发五部

目录

1、webkit架构 (3)

2、Application (3)

2.1 WebViewClient里面几个重要方法 (4)

2.2 WebChromeClient里面几个重要的方法 (4)

2.3 使用webview的基本流程 (4)

2.4 使用webview的扩展流程 (5)

3、Webkit(framework) (7)

3.1 webkit(framework)流程的介绍 (7)

3.2 webkit(framework)的一些扩展功能的修改: (13)

4、Webkit(external) (16)

4.1 从文件管理器上传文件到邮箱附件里 (17)

4.2 修改webview上的复制效果 (18)

4.3 扩展WML的支持 (19)

4.4 调试 (19)

5、浏览器开发过程中的一些调试手段 (20)

1、webkit架构

目前Android平台自带的浏览器都是以webkit作为解析处理核心的,能够较好的使用webkit提供的功能,能够帮忙我们优化浏览器的一些功能和体验。

从架构上来看,android中的webkit的架构先可以划分为三个主要的部分。如图1-1,application对应的主要是使用webview等实现相应功能的应用,这块目前主要是浏览器或者其他三方应用。Webkit(framework)主要是作为对底层Webkit封装,并为应用提供一些显示方面扩展的功能。Webkit(external)则是整个webkit的核心部分,负责对页面的解析和显示排版等处理。

图1-1 android中webkit架构流程

2、Application

针对普通的应用开发者来说,并不需要知道webkit的实现流程,以及怎么去修改framework中的webkit。一般只需要知道怎么去使用webkit就可以达到自己想要的功能了。Android平台为开发者提供了webview等相应的组件来使用webkit的相应功能。下面就介绍下webview的使用和需要注意的一些地方。

Webview是继承了viewgroup的android提供的一些基本view之一,通过使用webview 可以加载本地或者网络服务器上的html等一些页面。而通常我们会和webview配合使用的WebViewClient和WebChromeClient。

2.1 WebViewClient里面几个重要方法

onPageStarted:页面开始加载时会调用,用户可以在这个回调里面显示进度条以及一些初始操作。

onPageFinished:页面加载完毕时调用,可以在这个回调里面刷新界面。

shouldOverrideUrlLoading:需要用户是否针对这个url需要做特殊处理,在这个回调里面,可以对wtai协议或者其他一些特殊的url进行特殊的处理。另外,如果想要让所有点击的link都在当前窗口打开,则一般需要在这个回调里面这样做。

在这个回调里面如果返回true的话,webkit就认为用户以及处理过了,就不会再进行处理了。如果返回false,webkit会根据已有的逻辑进行处理。如打开新的窗口加载这个url等操作。

2.2 WebChromeClient里面几个重要的方法

onProgressChanged:在加载进度有变动的时候会调用这个函数,所以可以在这个函数里面更新加载进度条。

onCreateWindow:在这个回调里面创建窗口

onGeolocationPermissionsShowPrompt:在这个回调里面会提示是否允许使用位置信息openFileChooser:在这个回调里面要求用户调用打开文件选择来选择文件

2.3 使用webview的基本流程

在使用webview的应用里面,首先创建一个webview,然后根据自己应用的需要添加WebViewClient或者WebChromeClient监听对象来实现一些界面上或者流程上的修改。如:

创建好这些后,通过webview的loadurl就可以加载网络上的数据或者本地数据了。如;

互联网用:webView.loadUrl("https://www.doczj.com/doc/069027489.html,");

本地文件用:webView.loadUrl("file:///android_asset/XX.html");

使用的地方需要注意的有:

(1)如果是要加载网络服务器上的内容,则必须在应用的AndroidManifest.xml中使用许可"android.permission.INTERNET",如Browser等类似的应用。如果只

是加载本地文件系统里面的文件,则可以不需要声明这个权限,如

Htmlviewer。

(2)如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”

键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是

退出浏览器,需要在当前Activity中处理并消费掉该Back事件。

2.4 使用webview的扩展流程

在上面简单介绍了使用webview的一些流程,通过这些流程,普通的应用可以完全满足需要了。由于浏览器需要其他等比较丰富的功能和支持,所以需要比较复杂的处理流程。下面就介绍下这些扩展的处理流程。

(1)shouldOverrideUrlLoading里面对特殊的url以及用户的一些操作的处理。针对需要重新加载的url,需要浏览器这边区别处理。目前需要单独处理的主要有下面几类:Wtai协议对应的url,WTAI 全称Wireless Telephony Applications Interface。通过WTAI协议可以调用本地的电话簿、信息等模块做相应的功能。如:在WML中可以调用设备的WTAI函数来呼叫特定的电话号码(最常用的功能之一),代码如下所示:<go href="wtai://wp/mc;$(phone_no)"/>通过解析这些信息可以呼叫phone_no对应的号码。如果有兴趣,可以找下wtai协议来看看就知道了。

是由其他应用处理的url,如smsto:10657532521027?body=51,则通过startActivity 启动相应的Activity来处理这个url。

由于一些网页,常见的如https://www.doczj.com/doc/069027489.html,电脑版之类的页面,打开新的url是要求在新窗口打开的,在打开前,webkit会调用shouldOverrideUrlLoading。如果需求是要求可以选择其他浏览器来打开这个新的url,则一般是通过startActivityIfNeeded来启动选择浏览器的界面。由于我们目前的需求是要求不能弹出选择框,直接用本地的浏览器打开。针对这种需求,我们可以通过加判断ACCEPTED_URI_SCHEMA.matcher(url).matches(),判断当前的url是否可以被浏览器处理,如果可以则直接返回false。返回false表示需要webkit来处理这个url,这个时候webkit就会根据当前的流程来处理,如打开一个新的窗口加载这个url 等操作。

(2)获取网页的缩略图。在我们开发的过程中,会有需求要求我们获取网页的缩略图给用户显示。就如我们目前的需求里面需要获取缩略图在多窗口切换的时候使用,以及在快捷方式里面使用。获取缩略图的方式可以通过webview中的capturePicture来抓去当前浏览页面的截图,抓取后就根据自己的需要存储下来(目前浏览器是存储在数据库中)。在抓取缩略图的时机可以有多种方式:1、可以在onPageFinished里抓取;2、可以通过webview里面的setPictureListener设置PictureListener,当页面的图片有变动时会调用这个函数,可以在这个函数中抓取缩略图(由于生成缩略图需要的时间比较长,为了在这个函数里面尽快返回,浏览器里面采用sendmessage到BrowserActivity里面来处理生成缩略图的流程)。

(3)在浏览器里面触发添加下载项。在webview的使用过程中,遇到一些下载的地址时,如果我们要求下载这些内容,则必须创建一个DownloadListener,并且通过webview里面的setDownloadListener设置到webkit中实现对下载的监听。如果遇到需要下载的url,则会调用到DownloadListener中的onDownloadStart。开发者如果需要实现下载文件的功能,就在onDownloadStart里面添加对下载的支持。关于下载这块,目前android是有一个下载管理的应用,其他应用在向DownloadProvider插入下载项后就完全可以开始正常的下载。

(4)在网页中复制文字。在webview中长按键可以将webview置为复制状态,这个时候就可以根据自己的需要选择相应的文本。但是如果我们需要一种方式:不需要在webview 上长按键就可以调出复制效果。其中webview中的emulateShiftHeld函数就提供给了我们这样的功能,调用emulateShiftHeld这个函数就可以直接让webview进入复制状态,达到我们要求的效果。关于修改webview中的复制效果后续我们会继续讨论。

(5)在webview上查找对应的文本。在网页上查找相应的文本是比较有用的一个功能,webview同样给我们提供了这样一组接口来实现相应的功能。首先,通过setFindIsUp(true)设置查找的标记位为true。然后通过webview中的findAll查找出想要查找的文本,然后通过findNext来向上或者向下跳转查找的文本(findNextd中的参数为true或者false来实现向下或者向上)。最后查找结束时,需要通过setFindIsUp(flase)把查找的标记位设置为false。

(6)多窗口的创建和实现流程。随着手机性能的提升,目前android手机都是支持多窗口的功能。而一些页面也是要求在新的窗口打开,以及提升用户体验,都需要实现多窗口的功能。目前多窗口的实现是各个activity自己来处理的,如浏览器里面的Tab和TabControl,

他们之间的逻辑关系图如下:

每个Tab对应一个窗口,目前最多为8个窗口。每个Tab有一个webview WebChromeClient和WebViewClient,在处理流程上是相互独立的。创建一个Tab分两种方式:一种是用户主动创建一个新的Tab,另外一种是页面要求在新窗口加载,属于被动创建新的Tab。

3、Webkit(framework)

Android中的webkit(framework)作为承上启下的一层,为应用提供了简单的webview来实现页面的加载和显示,同时又作为封装真正解析和显示核心的存在。通过下面这张关系图可以大概了解下webkit整个流程。webkit(framework)通过JNI的接口调用webkit(external)来实现具体的加载和排版等相应操作。反之,webkit(external)通过调用GetJMethod来调用webkit(framework)中的函数实现向webkit(framework)回调。

3.1 webkit(framework)流程的介绍

了解了webkit(framework)在整个webkit的地位和流程后。接下来就对webkit(framework)进行一个比较详细的介绍。如下图,webkit(framework)几个主要的类的关系流程如下

WebView对象的生成主要涉及3个类CallbackProxy、WebViewCore以及WebViewDatabase。其中CallbackProxy对象用于UI线程和WebCore线程交互功能,WebViewCore是WebKit的核心层,负责与C层交互以及WebKit模块C层类库初始化。而WebViewDatabase为WebKit模块运行时缓存、数据存储提供支持。

下面对几个主要的类进行详细的说明下

1.WebView

WebView类是WebKit模块Java层的视图类,所有需要使用Web浏览功能的Android 应用程序都要创建该视图对象显示和处理请求的网络资源。目前,WebKit模块支持HTTP、HTTPS、FTP以及javascript请求。WebView作为应用程序的UI接口,为用户提供了一系列的网页浏览、用户交互接口,客户程序通过这些接口访问WebKit核心代码。

2.WebViewDatabase

WebViewDatabase是WebKit模块中针对SQLiteDatabase对象的封装,用于存储和获取运行时浏览器保存的缓冲数据、历史访问数据、浏览器配置数据等。该对象是一个单实例对象,通过getInstance方法获取WebViewDatabase的实例。WebViewDatabase是WebKit模块中的内部对象,仅供WebKit框架内部使用。

3.WebViewCore

WebViewCore类是Java层与C层WebKit核心库的交互类,客户程序调用WebView 的网页浏览相关操作会转发给BrowserFrame对象。当WebKit核心库完成实际的数据分析和处理后会回调WebViweCore中定义的一系列JNI接口,这些接口会通过CallbackProxy将相关事件通知相应的UI对象。

4.CallbackProxy

CallbackProxy是一个代理类,用于UI线程和WebCore线程交互。该类定义了一系列与用户相关的通知方法,当WebCore完成相应的数据处理,则会调用CallbackProxy类中对应的方法,这些方法通过消息方式间接调用相应处理对象的处理方法。详细的处理流程在下文中会具体分析。

5.WebViewClient

WebViewClient类定义了一系列事件方法,如果Android应用程序设置了WebViewClient派生对象,则在页面载入、资源载入、页面访问错误等情况发生时,该派生对象的相应方法会被调用。

6.WebChromeClient

WebChromeClient类定义了与浏览窗口修饰相关的事件。例如接收到Title、接收到Icon、进度变化时,WebChromeClient的相应方法会被调用。

大概了解了上面几个类的作用和流程后,接下来我们先主要先看下几个主要的流程,方便我们理解整个webkit(framework)大概的流程。

我们先了解下几个比较重要的类的消息流程,如下图

Webview和webviewcore之前的交互一般是通过handler处理消息来实现的,我们了解了这个大概的流程后对于我们解决一些问题很有帮助。接下来,了解下我们先了解下关于加载的一个消息流程。

通过上图我们可以大概了解下了webkit的一个加载的消息流程。在浏览器的开发过程中,我们一般情况下主要修改的是界面显示的效果,所涉及的文件主要为webview和webtextview这两个文件的处理流程。关于这两块的扩展修改,在下面的文档里面有比较详细的讲述。

3.2 webkit(framework)的一些扩展功能的修改:

Webkit(framework)的扩展功能的修改目前主要涉及到显示上的修改,其中涉及的文件主要为webtextview和webview,以及其他扩展功能的修改。下面就列出目前主要修改的一些内容。

1、UA的修改。

UA,即user agent,一般内容包含手机软硬件信息,以及手机浏览器的一些信息。通过这些信息,服务器可以根据他们自己的适配给手机返回相应的数据。在浏览器的开发过程中,会有遇到不少和这个相关的问题,所以这方面需要重视一下。

首先,介绍下目前常见UA的一种格式。在目前feature phone上的UA比较类似,一般格式如下:

Nokia N70的UA:

NokiaN70/5.0635.2.5.3 Series60/2.8 Profile/MIDP-2.0 Configuration/CLDC-1.1

OPPO T9的UA:

"OPPO_T9/3.46/15 Release/2009.2.1 Platform/MTK Browser/Obigo/Q03C Profile/MIDP-2.0 Configuration/CLDC-1.1"

对比类似的feature phone手机的UA,我们可以发现,一般最开始的时候就会声明手机的公

司和型号。在UA里面这个信息是很重要的,一般的服务器也只会去获取这个型号信息,而不会去管其他信息。

其中Release/2009.2.1是版本编号。

Platform/MTK是平台类型

Browser/Obigo/Q03C是浏览器类型

Profile/MIDP-2.0 Configuration/CLDC-1.1 是两个通用的版本信息。

而我们目前智能机的UA就不能照这个规范来了,智能机的UA是有自己的规范的,如果我们修改不当的话,会导致网站服务器给的数据并不适合我们手机,导致出现的一些问题。比如,网站如果不能识别出手机是android智能手机,很有可能把给featurephone适配的页面发送到我们手机这边,而在这种条件下,有的适合手机是解析出错的。这个后面会再说明。目前Android通用的手机UA格式如下:

Mozilla/5.0 (Linux; U; Android 2.3.4; zh-cn; OPPOT703 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

其中在frameworks\base\core\oppo\res\values\Strings.xml

和frameworks\base\core\res\res\values\Strings.xml

都有定义这样的字符串

web_user_agent:

Mozilla/5.0 (Linux; U; Android %s)AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

针对我们现有的android版本,这些信息一般是不需要修改的。因为这些信息也就是对应的这个版本的android的信息。我们主要的修改的是Android %s,这里面的%s是会拼接一些信息,主要修改的方面就是这些拼接的信息。

我们要先找到拼接这些信息的地方,在websettings.java有setUserAgentString这个方法,浏览器一般是通过这个来设置UA的,由于默认状况下,我们是采用的手机拼接的UA,所以这里的参数一般为null,这样我们通过setUserAgentString来设置UA时,就会采用默认拼接UA的流程。就是通过getCurrentUserAgent来获取的,在这个函数里面就对UA的一些信息进行拼接,得到我们最终的UA。目前OPPO的智能机有一个基本的规范,关于版本等信息一般是不用我们操心的(是从系统里面获取的版本信息,这个肯定是没问题的)。需要关注的就是型号等信息,在getCurrentUserAgent中,我们是通过下面截图上的代码获取的手机型号。由于Build.MODEL现在获取的只有手机的型号信息,如X903、T703等。按照公司的规范是要加OPPO字段,所以这个地方需要做下拼接OPPO字段的处理。

最终得到我们目前T703的UA为

Mozilla/5.0 (Linux; U; Android 2.3.4; zh-cn; OPPOT703 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

在开发过程中,我们会遇到一些和UA相关的问题,针对这些问题这里进行分类说明下,以后遇到相关的问题也就好解决了。

(1)网站会根据不同的UA来返回不同的数据。这个是我们经常会遇到的一些事情,如我们经常去用不同的手机去加载同样的地址,返回的页面却差别很大。这就是网站服务器根据手机的UA来判断当前的手机的一个系统和性能。像智能机等一些高端手机,页面包含的图片和布局信息就比较丰富,页面就很好看。非智能机等一些手机,如A201等这些手机,给的页面就是普通的手机页面,页面包含的图片信息比较少,所需要的手机的配置也就低些。

(2)网站匹配手机型号的问题。在访问一些网站时,网站会匹配手机的型号,如常见的一些3g这些站点下载应用时会匹配你的手机。有的时候会发现手机型号偶尔会匹配错误,如之前E21W会被匹配成索爱的一款手机。导致这种问题的出现是由于网站的匹配手机的信息库中没有这款手机的型号,同时匹配策略导致的匹配错误。这种修改一般是需要同营销沟通让网站方面能够识别我们的手机。

(3)网站区别识别的问题。在开发E21W的过程中,我们有遇到这样一个问题。在https://www.doczj.com/doc/069027489.html,访问的时候,我们手机被识别成电脑,而这个网站则要求终端必须是手机才能正常进行用户登陆。当时推断是UA的问题,然后我们把手机的UA换成nokia 的后,完全可以正常登陆了。经过最后的逐步确认,推断出mop识别UA的策略:首先会去识别手机的型号,如nokia、索爱、三星以及摩托罗拉这些知名厂商或者和他们有合作的厂商。由于我们公司并没有和他们进行合作,所以很遗憾,我们的手机不被识别。然后,如果是不能识别型号的手机,这个时候,他会去判断手机浏览器的类型。当时测试了Obigo的手机浏览器是可以的,推断是因为国内大部分的厂商都用的MTK的平台,而MTK平台采用的浏览器类型为Obigo的,所以mop站点把这个浏览器类型给放过了。而当时E21W采用的是ACCESS的浏览器,导致也完全无法识别。像类似这样的问题,有两种途径:一种是营销去适配站点;另外一种就是修改UA,不过修改UA带来的问题就是UA是不标准的了。

(4)网关区别对待的问题。在实际的开发中,我们通过网关去访问,偶尔会出现一些问题。就是其他手机访问或者其他功能是正常的,但是我们的却是有问题。在很多时候,合作方需要我们去换成另外功能是正常的手机的UA再进行测试。在解决类似的问题过程中,经过咨询运营商的技术人员,他们回复一般不会针对UA进行区别处理。

但是很多时候为了排查问题,我们还是会进行这样替换UA的测试。所以在开发的过程中,留下一个替换UA的简便方式能够帮我们尽快的验证这些问题。

通过上述对UA的一个大概的描述,可以对UA进行了一个初步的了解。在实际的开发过程和解决问题的过程中,我们可以多留心下这块,能给我们带来比较快的解决问题的思路。

2、针对复制时的popupmenu的扩充。

按照公司对智能机的要求,需要在webview复制的时候,弹出复制的popupmenu。目前这块的处理方案基本是参考的89的方案来做的,基本的流程是在view里面加入了新的pupmenu的实现,在webview里面按照要求调用得到的。

3、在webview上长按键进入复制状态。这个的流程就比较简单了,由于webview是继

承于viewgroup的,所以可以直接在performlongclick里面调用setUpSelect进入复制状态。随后的相应的复制流程根据需要在相应的事件处理函数里说明。

4、webview对放大镜的支持。由于android默认的webview是不支持放大镜的,所以

如果实现这个功能,需要我们自己扩展。这个扩展放大镜的功能,目前可以根据textview里面对于放大镜的使用来扩展。需要注意的一些方面有:

(1)长按键时弹出放大镜和contextmenu之间的冲突关系

(2)放大镜和webtextview里面的放大镜和事件的冲突关系

5、webtextview扩展放大镜的效果。由于默认的webtextview是不支持放大镜和文本

选择的。即在isMagnifierAndTextSelectionEnabled直接返回false,textview在判断的时候就得到webtextview不支持这个功能。由于需求的要求,我们是要在webtextview里面支持放大镜和文本选择的功能。所以,可以针对这样进行修改:

其中,调用mWebView.isCanShowPopupMenu()来判断当时调用webview的是否是oppo 自己的应用。这样可以来决定在三方应用上采用android默认的显示流程,避免不必要的一些问题的产生。由于webtextview的放大镜在移动的时候会移动到webview的页面上,在交互上会出现一些bug,这就需要在webview做些处理解决这些bug。

4、Webkit(external)

Webkit(external)是整个webkit的核心,负责页面的加载和排版以及脚本等解析的工作。目前IOS、android等系统都将webkit作为内置的浏览器解析和排版核心。所以,了解webkit后会能够让我们足够深入了解整个android系统浏览器排版以及解析。

Webkit整体包含的代码比较多,首先我们先了解下它大概的一个架构。整个webkit架构如图可以分为三部分:

1、webkit:webkit部分包含了很多不同平台对webkit封装的实现,即抽象出了能

直接与浏览器应用直接对应的一些概念的实现。

2、webcore:是整个webkit项目的核心,用来实现render引擎、解析web页面。

3、JavaScriptCore:是JavaScript的解释器。

关于webkit来说,目前了解的并不深入,所以这个地方主要还是讲下在实际修改中的一些问题,以及调试这些webkit的方法。

4.1 从文件管理器上传文件到邮箱附件里

由于android默认是没有文件管理器的,所以在webkit里面并不支持从文件管理器里面选择文件上传。这就需要我们修改android webkit的流程,能够实现从文件管理器里面正常上传文件。

首先,根据WebChromeClient中的openFileChooser来找到最终调用处-WebViewCore。在WebViewCore 的openFileChooser函数中,我们可以看到如下图所示,获取的路径是从数据库里面查找出的相应文件的名字,最终拼接成为一个全路径。列入url为content://media/external/images/media/54的在查找数据库后就可以得到54对应的文件的名字,最终拼接成为一个路径。

而通过文件管理器获得的url,在传递进来已经是一个全路径了,比如:file:///mnt/sdcard/DUOMI/music/Lydia_F.I.R.mp3就是指存在T卡上的一首歌曲。所以在这个地方,我们可以直接返回这个路径。在这个函数前面加上如下处理代码

关于路径的获取处理完后,我们需要考虑的external/webkit里面对这个的处理。根据MTK的工程师的帮助,我们需要修改的文件为:

external/webkit/WebKit/android/jni/WebCoreFrameBridge.cpp中的uriFromUriFileName来对file://类型的url进行特殊处理。修改代码如下:

4.2 修改webview上的复制效果

Webview中可以选择文本以及获取相应的文本达到复制的功能。但在实际开发过程中,我们需要修改webview的复制的效果,这就需要我们针对webview的选择文本以及复制有一个比较清楚的了解。目前复制效果指的主要是复制起始图标和终止图标,以及复制的popupmenu。

首先,我们先了解下这个复制效果的流程。android默认的复制效果的实现全部是在external/webkit里面通过SkCanvas采用代码来绘制的一个效果,并不是贴图得到的效果。这就要求如果我们修改这种复制效果的话,有两种方式;

1、为修改绘制的代码,最终修改绘制的一个效果。但是这种修改可能无法满足需要要

求的那种复制的效果,毕竟通过绘制要调整一些像素达到真正的效果需要不少工作量。同时这种修改在需求变动时会很麻烦。所以,这个方案不做优先考虑。‘

2、另外一种方案就是把原有通过代码绘制的流程注释掉,重新做一套新的通过贴图来

实现的复制效果。这样如果需求有变动我们就可以直接替换图片来达到效果。所以,我们优先采用这种方案来实现我们的修改。

按照第二种方案来实现的话,由于目前我们修改的复制效果主要是复制区域的起始和终止图标。按照修改的要求,我们有几个如下的流程:

(1)先把android原有的绘制起始和终止图标的代码注释掉,即在\external\webkit\WebKit\android\nav\SelectText.cpp中的drawSelectionRegion函数

里将绘制起始和终止的流程注释,如下图

(2)注释掉这个流程后,我们这个时候去复制,会发现复制的起始和终止图标消失了。接下来就添加我们自己的复制效果的流程。

首先,在external/webkit里面添加nativeGetSelectionStartBounds和

nativeGetSelectionEndBounds来获取起始和终止的图标的位置,这样我们就可以知道在什么地方来绘制这些图标。

由于我们采用的不是修改绘制的代码,而是采用新的类似贴图的方案。所以,为了实现这样的一个效果,我们就要在webview.java(framework/webkit)里面修改流程来显示这个起始和终止图标。

如下面的创建selector的流程图。其中,创建的selector为SelectPopupWindow。SelectPopupWindow是继承于PopupWindow,所以可以具有popupwindow的一些特性,能够显示在webview之上。

通过以上的流程我们就可以实现对复制的起始和终止图标的修改。

4.3 扩展WML的支持

由于android默认是不支持WML的,默认遇到WML的页面会当成text/plain来处理,导致wml的源码会直接显示到页面上。所以如果要支持WML,则需要我们对目前的webkit 进行修改来支持wml格式的页面。但是根据MTK工程师的反馈,由于WML的支持并不好,会导致出现一些crash的问题,有风险,需谨慎的扩展这种支持。附件里面是扩展WML支持的方法。

4.4 调试

关于webkit的调试主要是.so文件的调试,目前有两种手段吧:

1、加log,这种调试手段主要是为了解决流程上的问题。

2、如果是.so文件出现异常了,需要根据最后抓到log里面的PC值得到最终的代码,这个

对应的流程在刘奇虎那篇文档上有比较详细。我这边简单说明下一些事项吧:

如果两份代码是一样的话,那他们编译出的.so是完全一样的,所以如果是QT或者QE 出现的问题,如果你的.so对应的代码和QE对应版本.so的代码是一样的,就完全可以

用本地的.so来查找代码。

对应的命令如下:

prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-addr2line -f -e out/target/product/oppo13_gb/symbols/system/lib/libskia.so 00086ba4

就是指libskia.so中00086ba4对应的代码,通过在工程目录下运行这个命令可以得到对应的代码为

external/skia/src/core/SkPicture.cpp:267

就指对应的SkPicture.cpp 267行的代码,通过这个对应我们可以找到最终的栈信息。有的时候这个栈信息是比较明确的,可以很快找到问题根源。但另外一种情况就是这个地方是已经出错的栈信息,真正导致它出错的原因通过这个栈无法得到。这种情况下,我们就要根据当前的逻辑去仔细分析代码流程了。

5、浏览器开发过程中的一些调试手段

浏览器开发过程中会遇到不少问题,掌握好的和快的调试手段对于开发过程的帮助有莫大的帮助。那这里列下浏览器常用的一些调试手段:

1、LOG。Log作为开发过程中一种非常重要的调试手段,可以帮忙我们解决各种各样的问

题。对于log的使用细节在调试文档里面有比较详细的说明。我这边讲下我在使用log 过程中的一些心得把,由于我常用的一个调试手段是:修改代码加上打印log—编译apk 或者framework里面的jar—将apk或者jar拖到手机里面—重新抓取log分析。在拖入手机和重新抓取log这两块如果我们能够加快速度的话,能帮助我们节省不少时间。想必大家都有用过脚本来处理一些事情,所以这边我们也可以写两个脚本,一个是push apk 或者jar到手机里面,另一个是抓取main.log(由于我们一般调试只需要这个log)。有这两个脚本后,整个流程会快很多了,能帮忙节省一些时间。

2、单步调试。在调试应用逻辑流程中,单步调试是我们经常用到的一种调试方法,具体操

作流程在调试相关的文档里面有详细的描述,这里就不再说明了。

3、抓取数据包。由于浏览器等PS(数据包业务)类的应用,会经常遇到一些和网络相关

的问题,抓取以及分析抓取到的数据包对于问题根源分析有很大的帮助。Android平台adb里面提供了可以直接抓取数据包的命令,这对于网络应用开发者是一个福音。之前在BREW和MTK的平台里面,都没有直接抓取数据包的方法,都是需要抓取log,然后从log里面提取相应的数据包。这样很麻烦而且很多时候也抓不到。这样浪费了开发者大量的时间去抓取log。下面介绍下android平台直接通过adb抓取数据包的过程。将手机连接上电脑后,打开cmd,运行如下命令:

adb shell setprop net.http.debug true

adb shell tcpdump -i any -p -s 0 -w /data/capture.pcap

然后,就开始相应的网络操作,这个时候抓取的数据包一直会存储到data/capture.pcap 里面。当操作结束后,我们就可以把数据包从手机拖出来,用Wireshark打开进行分析。

当然,这个抓取的命令和拖数据包的流程我们都可以写到脚本里面,每次需要抓取的时候运行相应的脚本即可以获取相应的数据包,这样也会快捷不少。那下面说明下获取数据包后一般的分析流程:

(1)如果对应的网络问题其他手机都有,那首先怀疑是anroid平台自有的问题或者是网络服务器的问题,这就需要对数据包仔细分析得到结论(如WML

支持、场测的时候服务器不响应)。如果是只有本机才有的现象,一般这就

android蓝牙介绍二蓝牙代码架构及其uart 到rfcomm流程

Android bluetooth介绍(二) android 蓝牙代码架构及其uart 到rfcomm 流程 一、Android Bluetooth Architecture蓝牙代码架构部分(google 官方蓝牙框架) Android的蓝牙系统,自下而上包括以下一些内容如上图所示: 1、串口驱动 Linux的内核的蓝牙驱动程、Linux的内核的蓝牙协议的层 2、BlueZ的适配器

BlueZ的(蓝牙在用户空间的函式库) bluez代码结构 Bluetooth协议栈BlueZ分为两部分:内核代码和用户态程序及工具集。(1)、内核代码:由BlueZ核心协议和驱动程序组成 Bluetooth协议实现在内核源代码 kernel/net/bluetooth中。包括 hci,l2cap,hid,rfcomm,sco,SDP,BNEP等协议的实现。 (2)、驱动程序:kernel/driver/bluetooth中,包含Linuxkernel对各种接口的 Bluetooth device的驱动,如:USB接口,串口等。 (3)、用户态程序及工具集: 包括应用程序接口和BlueZ工具集。BlueZ提供函数库以及应用程序接口,便于程序员开发bluetooth应用程序。BlueZ utils是主要工具集,实现对bluetooth设备的初始化和控制。 3、蓝牙相关的应用程序接口 Android.buletooth包中的各个Class(蓝牙在框架层的内容-----java)

同样下图也是一张比较经典的蓝牙代码架构图(google官方提供) 二、蓝牙通过Hciattach启动串口流程: 1、hciattach总体流程

Android蓝牙编程

ANDROID 蓝牙编程 用BluetoothAdapter类,你能够在Android设备上查找周边的蓝牙设备然后配对(绑定),蓝牙通讯是基于唯一地址MAC来相互传输的,考虑到安全问题Bluetooth通讯时需要先配对。然后开始相互连接,连接后设备将会共享同一个RFCOMM通道以便相互传输数据,目前这些实现在Android 2.0或更高版本SDK 上实现。 一、查找发现 findding/discovering devices 对于Android查找发现蓝牙设备使用BluetoothAdapter类的startDiscovery()方法就可以执行一个异步方式获取周边的蓝牙设备,因为是一个异步的方法所以我们不需要考虑线程被阻塞问题,整个过程大约需要12秒时间,这时我们紧接着注册一个 BroadcastReceiver 对象来接收查找到的蓝牙设备信息,我们过滤ACTION_FOUND这个 Intent动作来获取每个远程设备的详细信息,通过附加参数在Intent字段EXTRA_DEVICE 和 EXTRA_CLASS, 中包含了每个BluetoothDevice 对象和对象的该设备类型BluetoothClass ,示例代码 private final BroadcastReceiver cwjReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); myArrayAdapter.add(device.getName() + " android123 " + device.getAddress()); //获取设备名称和mac地址 } } }; // 注册这个 BroadcastReceiver IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(cwjReceiver, filter); 最后android123提醒大家需要注意的是,记住在Service或Activity中重写onDestory()方法,使用unregisterReceiver方法反注册这个BroadcastReceiver对象保证资源被正确回收。 一些其他的状态变化有 ACTION_SCAN_MODE_CHANGED 额外参数 EXTRA_SCAN_MODE 和 EXTRA_PREVIOUS_SCAN_MODE以及SCAN_MODE_CONNECTABLE_DISCOVERABLE、 SCAN_MODE_CONNECTABLE和SCAN_MODE_NONE, 蓝牙模块 二、配对绑定 bnded/paired device 在Android中配对一个蓝牙设备可以调用BluetoothAdapter类的getBondedDevices()方法可以获取已经配对的设备,该方法将会返回一个BluetoothDevice数组来区分每个已经配对的设备,示例代码如下: Set pairedDevices = cwjBluetoothAdapter.getBondedDevices();

Android蓝牙功能及RFCOMMSDP简介

A n d r o i d蓝牙功能及R F C O M M S D P简介文件管理序列号:[K8UY-K9IO69-O6M243-OL889-F88688]

A n d r o i d2.0蓝牙功能及R F C O M M、S D P简介一.Android2.0蓝牙功能简介 Google于2009年10月28日发布了AndroidSDK2.0版本。对于开发人员来说,最关心的莫过于新版本添加了哪些新特性,API有哪些改动。2.0版本发布前,最受关注的就是能否在新版本中添加蓝牙功能。Google果然不负众望,在2.0版本中加入了蓝牙功能,使Android平台功能更加强大。蓝牙模块实现了以下功能: 蓝牙的打开/关闭。 设备和服务的探索。 使用RFCOMM连接远程设备发送/接收数据。 公布RFCOMM服务和监听接入的RFCOMM连接。 新版本添加了android.bluetooth包。该包提供了一些用于管理蓝牙设备的功能类。蓝牙的APIs允许应用程序连接或断开headset(头戴式耳机),扫描其他蓝牙设备并与之配对。增强了写和修改本地服务发现协议(ServiceDiscoveryProtocol,SDP)数据库,查询其他蓝牙设备SDP数据库,在Android上建立RFCOMM通道/Socket,连接到其他设备指定Socket的控制。 注意:不是所有的Android设备都能保证有蓝牙功能。 下面是android.bluetooth包中类的简述: BluetoothAdapter代表本地蓝牙适配器。 可以使用getDefaultAdapter()方法获得默认的本地蓝牙适配 器。

Android蓝牙开发经典笔记,程序和说明

Bluetooth Low Energy——蓝牙低功耗 Android4.3(API级别18)引入内置平台支持BLE的central角色,同时提供API和app应用程序用来发现设备,查询服务,和读/写characteristics。与传统蓝牙(ClassicBluetooth)不同,蓝牙低功耗(BLE)的目的是提供更显著的低功耗。这使得Android 应用程序可以和具有低功耗的要求BLE设备,如接近传感器,心脏速率监视器,健身设备等进行通信。 关键术语和概念 下面是关键BLE术语和概念的总结: 通用属性规范(GATT)—GATTprofile是一个通用规范用于在BLE链路发送和接收被称为―属性(attributes)‖的数据片。目前所有的低功耗应用profile都是基于GATT。 蓝牙SIG定义了许多profile用于低功耗设备。Profile(配置文件)是一个规范,规范了设备如何工作在一个特定的应用场景。注意:一个设备可以实现多个profile。例如,一个设备可以包含一个心脏监测仪和电池电平检测器。 属性协议(ATT )—GATT是建立在属性协议(ATT )的顶层,通常也被称为GATT/ ATT 。ATT进行了优化用于在BLE设备上运行。为此,它采用尽可能少的字节越好。每个attribute 属性被UUID(通用唯一标识符)唯一标识,UUID是标准128-bit格式的ID用来唯一标识信息。attributes 被ATT 格式化characteristics和services形式进行传送。 特征(Characteristics)—一个characteristics包含一个单独的value值和0 –n个用来描述characteristic 值(value)的descriptors。一个characteristics可以被认为是一种类型的,类似于一个类。 描述符(descriptor)—descriptor是被定义的attributes,用来描述一个characteristic的值。例如,一个descriptor可以指定一个人类可读的描述中,在可接受的范围里characteristic值,或者是测量单位,用来明确characteristic的值。 服务(service)—service是characteristic的集合。例如,你可以有一个所谓的―Heart RateMonitor‖service,其中包括characteristic,如―heart rate measurement ‖。你可以在https://www.doczj.com/doc/069027489.html,找到关于一系列基于GATT的profile和service。 角色和职责 以下是适用于当一个Android设备与BLE设备交互的角色和责任: 中心设备(central)与外围设备(peripheral)。这也适用于BLE连接本身。Central设备进行扫描,寻找advertisenment,peripheral设备发出advertisement。 GATT server(服务器)与GATTclient(客户端)。这决定了两个设备建立连接后如何互相交互。 要了解它们的区别,假设你有一个Android手机和活动跟踪器,活动跟踪器是一个BLE装置。这款手机扮演central角色;活动跟踪器扮演peripheral角色(建立一个BLE连接,必须具备两者。如果两个设备只支持central角色或peripheral角色,不能跟对方建立一个BLE连接)。

Android平台蓝牙通信的实现

Android平台蓝牙通信的实现 一、Android蓝牙概况 1.蓝牙的来历 蓝牙这个名称来自于第十世纪的一位丹麦国王哈拉尔蓝牙王,Blatand 在英文里的意思可以被解释为Bluetooth( 蓝牙)因为国王喜欢吃蓝莓,牙龈每天都是蓝色的所以叫蓝牙。在行业协会筹备阶段,需要一个极具有表现力的名字来命名这项高新技术。行业组织人员,在经过一夜关于欧洲历史和未来无线技术发展的讨论后,有些人认为用Blatand 国王的名字命名再合适不过了。Blatand 国王将挪威,瑞典和丹麦统一起来;他的口齿伶俐,善于交际,就如同这项即将面世的技术,技术将被定义为允许不同工业领域之间的协调工作,保持着各个系统领域之间的良好交流,例如计算机,手机和汽车行业之间的工作。名字于是就这么定下来了。 Blatand 国王 蓝牙的创始人是爱立信公司,爱立信早在1994 年就已进行研发。1997 年,爱立信与其他设备生产商联系,并激发了他们对该项技术的浓厚兴趣。1998 年2 月,跨国大公司包括诺基亚、苹果、三星组成的一个特殊兴趣小组(SIG),他们共同的目标是建立一个全球性的小范围无线通信技术,即蓝牙。而蓝牙这个标志的设计:它取自Harald Bluetooth 名字中的「H」和「B」两个字母,用古北欧字母来表示,将这两者结合起来,就成为了蓝牙的logo (见图)。

蓝牙logo 2.蓝牙开发概况 对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Android的蓝牙开发,国内的例子很少 Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发 现如今,蓝牙已是每部安卓手机标配的功能,多用于蓝牙耳机和传输文件,还可以多部手机之间建立蓝牙通信,本文就通过参考SDK自带的一个BluetoothChat的例程,开发一个新的蓝牙聊天室。 在Android1 的时候,相关API 非常不完善,还不能简单的使用Bluetooth 开发,有一个开源项目可以帮助程序员使用、开发蓝牙,支持直接方法bluetooth 协议栈。在Android2 以后,框架提供了一些官方API 来进行蓝牙的通信,但目前的程序也比较不完善。本文主要讨论Android2 蓝牙通信的API 使用方法。 首先看聊天效果图: 二、Android编程介绍 (一)编程环境 Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Android蓝牙功能及RFCOSDP简介

A n d r o i d蓝牙功能及R F C O S D P简介 集团标准化小组:[VVOPPT-JOPP28-JPPTL98-LOPPNN]

A n d r o i d2.0蓝牙功能及R F C O M M、S D P简介 一.Android2.0蓝牙功能简介 Google于2009年10月28日发布了AndroidSDK2.0版本。对于开发人员来说,最关心的莫过于新版本添加了哪些新特性,API有哪些改动。2.0版本发布前,最受关注的就是能否在新版本中添加蓝牙功能。Google果然不负众望,在2.0版本中加入了蓝牙功能,使Android平台功能更加强大。蓝牙模块实现了以下功能: 蓝牙的打开/关闭。 设备和服务的探索。 使用RFCOMM连接远程设备发送/接收数据。 公布RFCOMM服务和监听接入的RFCOMM连接。 新版本添加了android.bluetooth包。该包提供了一些用于管理蓝牙设备的功能类。蓝牙的APIs允许应用程序连接或断开headset(头戴式耳机),扫描其他蓝牙设备并与之配对。增强了写和修改本地服务发现协议(ServiceDiscoveryProtocol,SDP)数据库,查询其他蓝牙设备SDP数据库,在Android上建立RFCOMM通道/Socket,连接到其他设备指定Socket的控制。 注意:不是所有的Android设备都能保证有蓝牙功能。 下面是android.bluetooth包中类的简述: BluetoothAdapter代表本地蓝牙适配器。 可以使用getDefaultAdapter()方法获得默认的本地蓝牙适配器。 使用BluetoothDevice类在远程蓝牙设备上进行操作。 BluetoothClass表示一个蓝牙类?。 蓝牙类是一个32位字段,这些位的格式定义在。这个类包含32位字段,提供常数和方 法去确定在这个字段中编码的服务类和设备类(服务类可以有多个)。 每个蓝牙类可组成零至多个服务类,确切的说是一个设备类。这个设备类进一步分解为 主要和次要设备类组件。 这个类通常用于表示一个设备(如在用户界面显示一个图标),但不能可靠的描述哪个 蓝牙配置或服务被设备支持。精确的服务搜索是通过SDP请求得到的。 .远程设备可以通过getBluetoothClass()方法检索这个类。 BluetoothClass.Device蓝牙设备类。确切的说,每个BluetoothClass编码一个设备类,分为主要和次要组 件。 BluetoothClass.Device里的常量表示一个主设备和从设备的组合(即完整的设备类)

蓝牙模块介绍

Android 手机蓝牙模块介绍: 主机模块实物与从机一样,模块上有白点,主机模块会自动和从机模块配对,省却配对的麻烦,适合在需要两个设备间通过蓝牙串口无线通信的应用,无需电脑. 蓝牙透传模块可以让你原来使用串口的设备摆脱线缆的束缚在10米范围内实现无线串口通信。使用该模块无需了解复杂的蓝牙底层协议,只要简单的几个步骤即可享受到无线通信的便捷。蓝牙透传模块只有4个AT指令,分别是测试通讯,改名称,改波特率,改配对密码,AT指令必须从TXD,RXD信号脚设置,不能通过蓝牙信道设置。发送AT指令的设备可以是各种类型的MCU(比如51,avr,pic,msp430,arm等),也可以是电脑通过串口(PC串口接MAX232以后或者USB转串口)发送。 特别注意: 1、主机模块和从机模块均不能切换工作模式,只能是单一的工作模式(主或从) 2、主机模块只能配对HC06的从机模块,主机模块之间不能配对连接,主机模块也不能跟带蓝牙的电脑或者手机等其他蓝牙设备配对 3、从机模块可以跟带蓝牙的电脑或者部分带蓝牙的手机配对使用,从机模块之间不能连接,如果电脑没有 4、主机模块的AT指令比从机模块少了AT+NAME指令,其他指令相同 5、主机模块和从机模块的接口均为3.3V电平,可以直接连接各种TTL电平带串口MCU(5V的MCU请串联1K电阻)直接连接,设置参数可以用MCU或者本店的USB转串口,或者增加MAX232转换电路后的电脑串口 小常识: TXD:发送端,一般表示为自己的发送端,正常通信的时候接另一个设备的RXD。 RXD:接收端,一般表示为自己的接收端,正常通信的时候接另一个设备的TXD。 正常通信时候本身的TXD永远接设备的RXD! 自收自发:顾名思义,也就是自己接收自己发送的数据,也就是自身的TXD接到自身的RXD,用来测试本身的发送和接收是否正常。也称回环测试。 由于蓝牙核心板不方便接线,因此我们把它焊接到底板上,底板上含3.3V LDO,为了方便再拆卸,仅焊接有用的引脚,引出VCC、GND、TXD、RXD(TXD、RXD均为3.3V电平)四根线方便接线,STATE为LED 状态输出脚,未连接时输出脉冲,连接后输出高电平,可由MCU判断状态,需自行焊接插针,KEY接口对从机无效。该蓝牙模块可以接各种单片机,USB转串口等串口设备,输入电压3.6~6V(推荐5V,不得超过7V), 模块尺寸:3.57cm*1.52cm(cm) 注意:所标价格为单个模块的价格,并非一对模块的价格!!! 模块与单片机请遵循以下连接:

ble简介和androidble编程

ble简介和androidble编程 一.BLE和BT区别其实我知道许多程序员不太喜欢阅读除了代码以外的文档,因为有时这些过于冗长的文档对编程并没有更多的好处,有了协议,接口,demo差不多很多人就能写出很好质量的代码了。但其实更深入的编程是少了阅读的,阅读文档可以解决很多编程中遇到的困难,比如在大数据大流量情况下,很多正常的程序会表现出不可靠的一面,这已经不是够编程能解决的了,硬件的配置,服务器带宽,使用的数据库,调用的接口都有可能是瓶颈。比如BLE,同样的蓝牙,但却有着本质区别,一个表现就是不是所有蓝牙设备都支持BLE,编程如果不考虑这个问题,程序出错就会迷茫。再比如连接到BLE或者蓝牙上的设备是有数量限制的,如果不知道这个限制,在连接不上时,也会六神无主。BLE在智家居中和移动设备中的应用方兴未艾,做深入的研究推广到更多的应用上,还是有意义的。 1蓝牙的历史:蓝牙的创始公司是爱立信。1994年爱立信开始对小范围无线通信技术进行研发,在1997年,爱立信的研究激发了其他公司的浓厚兴趣,于是1998年2月,一些跨国大公司包括诺基亚、苹果、三星组成的一个特殊兴趣小组(SIG),他们共同的目标是建立一个全球性的小范围无线通信技术,该项技术就是蓝牙。2.BLE 是Bluetooth Low

Energy的缩写,又叫蓝牙4.0,区别于蓝牙3.0和之前的技术。BLE前身是NOKIA开发的Wibree技术,主要用于实现移动智能终端与周边配件之间的持续连接,是功耗极低的短距离无线通信技术,并且有效传输距离被提升到了100米以上,同时只需要一颗纽扣电池就可以工作数年之久。 3. BLE是在蓝牙技术的基础上发展起来的,既同于蓝牙,又区别于传统蓝牙。BLE设备分单模和双模两种,双模简称BR,商标为Bluetooth Smart Ready,单模简称BLE或者LE,商标为Bluetooth Smart。Android是在4.3后才支持BLE,这可以解释不是所有蓝牙手机都支持BLE,而且支持BLE的蓝牙手机一般是双模的。4.双模兼容传统蓝牙,可以和传统蓝牙通信,也可以和BLE通信,常用在手机上,android4.3和IOS4.0之后版本都支持BR,也就是双模设备。单模只能和BR和单模的设备通信,不能和传统蓝牙通信,由于功耗低,待机长,所以常用在手环的智能设备上。这可以解释手机上的BLE 与手环等设备上的BLE的区别。5不是所有手机都支持BLE,因为BLE不仅仅依靠软件实现,同时需要硬件支持,于是有很多手机不能联接智能手环等设备。Android4.3手机上安装的是双模BR,因此兼容蓝牙3.0之前的技术,既能与BLE设备通信,也能与传统蓝牙通信,比较耗电,能够像传统设备一样高速传输。大部分智能手环使用的单工BLE,不支持传统蓝牙,不能与之联结和通信,低功耗低速率设备。

Android+2.0+蓝牙功能及RFCOMM、SDP简介

Android 2.0 蓝牙功能及RFCOMM、SDP简介 一.Android 2.0蓝牙功能简介 Google 于2009年10月28日发布了Android SDK 2.0版本。对于开发人员来说,最关心的莫过于新版本添加了哪些新特性,API有哪些改动。2.0版本发布前,最受关注的就是能否在新版本中添加蓝牙功能。Google果然不负众望,在2.0版本中加入了蓝牙功能,使Android平台功能更加强大。蓝牙模块实现了以下功能: ?蓝牙的打开/关闭。 ?设备和服务的探索。 ?使用RFCOMM连接远程设备发送/接收数据。 ?公布RFCOMM服务和监听接入的RFCOMM连接。 新版本添加了android.bluetooth包。该包提供了一些用于管理蓝牙设备的功能类。蓝牙的APIs允许应用程序连接或断开headset(头戴式耳机),扫描其他蓝牙设备并与之配对。增强了写和修改本地服务发现协议(Service Discovery Protocol ,SDP)数据库,查询其他蓝牙设备SDP数据库,在Android上建立RFCOMM通道/Socket,连接到其他设备指定Socket 的控制。 注意:不是所有的Android设备都能保证有蓝牙功能。 下面是android.bluetooth包中类的简述:

Android蓝牙模型原理及设备之间的连接已再【eoeAndroid特刊】第六期中有所说明,在此不做赘述。详情请参见【eoeAndroid特刊】第六期4-6节。 二.协议简述 蓝牙规范(Specification of the Bluetooth System)就是蓝牙无线通信协议标准,它规定了蓝牙应用产品应遵循的标准和需要达到的要求。蓝牙协议规范遵循开放系统互连参考模型(Open System Interconnetion/Referenced Model, OSI/RM),从低到高地定义了蓝牙协议堆栈的各个层次。 在蓝牙规范中,中介协议是为高层应用协议或程序在蓝牙逻辑链路上工作提供了必要的支持,为应用曾提供了各种不同的标准接口。这部分协议包括RFCOMM、SDP、IrDA、(PPP/IP/TCP/UDP)、(TCS/AT)等。 2.1 串口仿真协议(RFCOMM) 基于欧洲电信标准化协会(European Telecommunication Standardization Institute, ETSI)的TS07.10标准制定。该协议用于模拟串行接口环境,使得基于串口的传统应用仅作少量的修改或者不做任何修改可以直接在该层上运行。 通过提供串行端口仿真,RFCOMM 可以同时支持遗留串行端口应用程序以及其它应用程序中的OBEX 协议。RFCOMM 是ETSI TS 07.10 标准的一个子集,也具有一些蓝牙特定的适配性。 RFCOMM 协议能在两台蓝牙设备之间同时维持多达60 个连接。蓝牙设备中同时使用的连接数目取决于特定实施。 由于有了RFCOMM,完整的通信路径包括两个运行在不同设备(通信端点)上的应用程序及它们之间的通信段。上图显示了完整的通信路径 RFCOMM 旨在覆盖利用串行端口设备的应用程序。在简单的配置中,通信段是一个设

ANDROID蓝牙编程

ANDROID蓝牙编程 用BluetoothAdapter类,你能够在Android设备上查找周边的蓝牙设备然后配对(绑定),蓝牙通讯是基于唯一地址MAC来相互传输的,考虑到安全问题Bluetooth通讯时需要先配对。然后开始相互连接,连接后设备将会共享同一个RFCOMM通道以便相互传输数据,目前这些实现在Android 2.0或更高版本SDK 上实现。 一、查找发现 findding/discovering devices 对于Android查找发现蓝牙设备使用BluetoothAdapter类的startDiscovery()方法就可以执行一个异步方式获取周边的蓝牙设备,因为是一个异步的方法所以我们不需要考虑线程被阻塞问题,整个过程大约需要12秒时间,这时我们紧接着注册一个 BroadcastReceiver 对象来接收查找到的蓝牙设备信息,我们过滤ACTION_FOUND这个 Intent动作来获取每个远程设备的详细信息,通过附加参数在Intent字段EXTRA_DEVICE 和 EXTRA_CLASS, 中包含了每个BluetoothDevice 对象和对象的该设备类型 BluetoothClass ,示例代码 private final BroadcastReceiver cwjReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); myArrayAdapter.add(device.getName() + " android123 " + device.getAddress()); //获取设备名称和mac地址 } } }; // 注册这个 BroadcastReceiver IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(cwjReceiver, filter); 最后android123提醒大家需要注意的是,记住在Service或Activity中重写onDestory()方法,使用unregisterReceiver方法反注册这个BroadcastReceiver对象保证资源被正确回收。 一些其他的状态变化有 ACTION_SCAN_MODE_CHANGED 额外参数 EXTRA_SCAN_MODE 和 EXTRA_PREVIOUS_SCAN_MODE以及 SCAN_MODE_CONNECTABLE_DISCOVERABLE、 SCAN_MODE_CONNECTABLE和 SCAN_MODE_NONE, 蓝牙模块

Android之蓝牙驱动开发总结

Android之蓝牙驱动开 发总结

二Android Bluetooth架构 (1) 2.1 Bluetooth架构图 (1) 2.2 Bluetooth代码层次结构 (3) 三Bluetooth协议栈分析 (4) 3.1 蓝牙协议栈 (4) 3.2 Android与蓝牙协议栈的关系 (5) 四Bluetooth之HCI层分析 (5) 4.1 HCI层与基带的通信方式 (6) 4.2 包的分析及研究 (7) 4.3 通信过程的研究与分析 (8) 五Bluetooth之编程实现 (8) 5.1 HCI层编程 (8) 5.2 L2CAP层编程 (10) 5.3 SDP层编程 (12) 六Bluetooth之启动过程实现 (13) 6.1 Bluetooth启动步骤 (14) 6.2 Bluetooth启动流程 (14) 6.3 Bluetooth数据流向 (14) 6.4 Bluez控制流程 (14) 6.5 Bluetooth启动过程分析 (15) 七Bluetooth之驱动移植 (15) 7.1 android系统配置 (15) 7.2 启动项修改 (16) 7.3 电源管理rfkill驱动 (16) 7.4 Rebuild Android image and reboot (16) 7.5 实现BT睡眠唤醒机制 (16) 7.6 系统集成 (17) 八Bluetooth之调试与编译 (17) 8.1 Bluetooth驱动调试 (17)

九Bluetooth之应用程序开发 (18) 9.1 Bluetooth的API开发 (18) 9.2 The Basics开发 (18) 9.3 Bluetooth Permissions开发 (19) 9.4 Setting Up Bluetooth服务 (19) 9.5 Finding Devices服务 (20) 9.6 Connecting Devices服务 (22) 9.7 Managing a Connection服务 (26) 9.8 Working with Profiles服务 (28) 十总结与疑问 (29)

Android蓝牙功能及RFCOSDP简介

A n d r o i d2.0蓝牙功能及R F C O M M、S D P简介 一.Android2.0蓝牙功能简介 Google于2009年10月28日发布了AndroidSDK2.0版本。对于开发人员来说, 最关心的莫过于新版本添加了哪些新特性,API有哪些改动。2.0版本发布前,最受 关注的就是能否在新版本中添加蓝牙功能。Google果然不负众望,在2.0版本中加 入了蓝牙功能,使Android平台功能更加强大。蓝牙模块实现了以下功能: ?蓝牙的打开/关闭。 ?设备和服务的探索。 ?使用RFCOMM连接远程设备发送/接收数据。 ?公布RFCOMM服务和监听接入的RFCOMM连接。 新版本添加了android.bluetooth包。该包提供了一些用于管理蓝牙设备的功能类。蓝牙的APIs允许应用程序连接或断开headset(头戴式耳机),扫描其他蓝牙设备并与之配对。增强了写和修改本地服务发现协议(ServiceDiscoveryProtocol,SDP)数据库,查询其他蓝牙设备SDP数据库,在Android上建立RFCOMM通道/Socket,连接到其他设备指定Socket的控制。 注意:不是所有的Android设备都能保证有蓝牙功能。 下面是android.bluetooth包中类的简述:

Android蓝牙模型原理及设备之间的连接已再【eoeAndroid特刊】第六期中有所说明,在此不做赘述。详情请参见【eoeAndroid特刊】第六期4-6节。 二.协议简述 蓝牙规范(SpecificationoftheBluetoothSystem)就是蓝牙无线通信协议标准,它规定了蓝牙应用产品应遵循的标准和需要达到的要求。蓝牙协议规范遵循开放系

蓝牙app开发-Android开发解析

蓝牙app开发-Android开发解析 深圳蓝牙app软件开发公司《酷点网络》由于近期正在开发一个通过蓝牙进行数据传递的模块,在参考了有关资料,并详细阅读了Android的官方文档后,总结了Android中蓝牙模块的使用 1. 使用蓝牙的响应权限 复制代码代码如下: 2. 配置本机蓝牙模块 在这里首先要了解对蓝牙操作一个核心类BluetoothAdapter 复制代码代码如下: BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); //直接打开系统的蓝牙设置面板 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, 0x1); //直接打开蓝牙 adapter.enable(); //关闭蓝牙 adapter.disable(); //打开本机的蓝牙发现功能(默认打开120秒,可以将时间最多延长至300秒) Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERA BLE);

discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); //设置持续时间(最多300秒) 3.搜索蓝牙设备 使用BluetoothAdapter的startDiscovery()方法来搜索蓝牙设备 startDiscovery()方法是一个异步方法,调用后会立即返回。该方法会进行对其他蓝牙设备的搜索,该过程会持续12秒。该方法调用后,搜索过程实际上是在一个System Service中进行的,所以可以调用cancelDiscovery()方法来停止搜索(该方法可以在未执行discovery请求时调用)。 请求Discovery后,系统开始搜索蓝牙设备,在这个过程中,系统会发送以下三个广播:ACTION_DISCOVERY_START:开始搜索 ACTION_DISCOVERY_FINISHED:搜索结束 ACTION_FOUND:找到设备,这个Intent中包含两个extra fields:EXTRA_DEVICE和EXT RA_CLASS,分别包含BluetooDevice和BluetoothClass。 我们可以自己注册相应的BroadcastReceiver来接收响应的广播,以便实现某些功能 复制代码代码如下: // 创建一个接收ACTION_FOUND广播的BroadcastReceiver private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // 发现设备 if (BluetoothDevice.ACTION_FOUND.equals(action)) { // 从Intent中获取设备对象 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

android蓝牙开发简介

对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Android的蓝牙开发,国内的例子很少 Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发,刚巧这段时间公司有蓝牙开发的需求,我看了很多国内、国外的资料,又研究了一下J2ME的蓝牙开发(为了找找思路),虽然我想要的功能还没实现(我曾经在很多论坛里问了很多遍,苦于没有高人解答..),我要实现的功能是连接一个硬件设备,凡是跟硬件沾上边的,都让软件人员开发头疼.. 好了,废话不说了,鉴于很多开发人员现在也有蓝牙开发的需求,也为了大家少走些弯路,先将我积攒的一点点在Android蓝牙开发经验与大家分享一下! 首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限 然后,看下api,Android所有关于蓝牙开发的类都在 android.bluetooth包下,如下图,只有8个类

而我们需要用到了就只有几个而已: 1.BluetoothAdapter 顾名思义,蓝牙适配器,直到我们建立bluetoothSocket连接之前,都要不断操作它 BluetoothAdapter里的方法很多,常用的有以下几个: cancelDiscovery() 根据字面意思,是取消发现,也就是说当我们正在搜索设备的时候调用这个方法将不再继续搜索 disable()关闭蓝牙 enable()打开蓝牙,这个方法打开蓝牙不会弹出提示,更多的时候我们需要问下用户是否打开,一下这两行代码同样是打开蓝牙,不过会提示用户: Intemtenabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enabler,reCode);//同 startActivity(enabler); getAddress()获取本地蓝牙地址

Android蓝牙开发(整理)

Android蓝牙开发 学习之前先了解两个基本概念: 1.RFCOMM协议: 一个基于欧洲电信标准协会ETSI07.10规程的串行线性仿真协议。此协议提供RS232控制和状态信号,如基带上的损坏,CTS以及数据信号等,为上层业务(如传统的串行线缆应用)提供了传送能力。 RFCOMM是一个简单传输协议,其目的是针对如何在两个不同设备上的应用之间保证一条完整的通信路径,并在它们之间保持一通信段。 RFCOMM是为了兼容传统的串口应用,同时取代有线的通信方式,蓝牙协议栈需要提供与有线串口一致的通信接口而开发出的协议。RFCOMM协议提供对基于L2CAP协议的串口仿真,基于ETSI07.10。可支持在两个BT设备之间同时保持高达60路的通信连接。 RFCOMM只针对直接互连设备之间的连接,或者是设备与网络接入设备之间的互连。通信两端设备必须兼容于RFCOMM协议,有两类设备:DTE (Data Terminal Endpoint,通信终端,如PC,PRINTER)和DCE (Data Circuit Endpoint,通信段的一部分,如Modem)。此两类设备不作区分。 2.MAC硬件地址 MAC(Medium/MediaAccess Control, 介质访问控制)MAC地址是烧录在NetworkInterfaceCard(网卡,NIC)里的.MAC地址,也叫硬件地址,是由48比特长(6字节),16进制的数字组成.0-23位叫做组织唯一标志符(organizationally unique,是识别LAN(局域网)节点的标识.24-47位是由厂家自己分配。其中第40位是组播地址标志位。网卡的物理地址通常是由网卡生产厂家烧入网卡的EPROM(一种闪存芯片,通常可以通过程序擦写),它存储的是传输数据时真正赖以标识发出数据的电脑和接收数据的主机的地址。 Android平台提供的蓝牙API去实现蓝牙设备之间的通信,蓝牙设备之间的通信主要包括了四个步骤:设置蓝牙设备、寻找局域网内可能或者匹配的设备、连接设备和设备之间的数据传输。以下是建立蓝牙连接的所需要的一些基本类: BluetoothAdapter类:代表了一个本地的蓝牙适配器。它是所有蓝牙交互的的入口点。利用它你可以发现其他蓝牙设备,查询绑定了的设备,使用已知的MAC地址实例化一个蓝牙设备和建立一个BluetoothServerSocket(作为服务器端)来监听来自其他设备的连接。 BluetoothDevice类:代表了一个远端的蓝牙设备,使用它请求远端蓝牙设备连接或者获取远端蓝牙设备的名称、地址、种类和绑定状态(其信息是封装在BluetoothSocket中)。 BluetoothSocket类:代表了一个蓝牙套接字的接口(类似于TCP中的套接字),它是应用程序通过输入、输出流与其他蓝牙设备通信的连接点。 BlueboothServerSocket类:代表打开服务连接来监听可能到来的连接请求(属于server 端),为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务套接字。当远端设备发起连接连接请求的时候,并且已经连接到了的时候,BlueboothServerSocket类将会返回一个BluetoothSocket。 BluetoothClass类:描述了一个蓝牙设备的一般特点和能力。它的只读属性集定义了设备的主、次设备类和一些相关服务。然而,它并没有准确地描述所有该设备所支持的蓝牙文件和服务,而是作为对设备种类来说的一个小小暗示。

基于安卓的蓝牙通信系统开发

目录 一、系统背景 (2) 1.1 Android系统概述 (2) 1.2 蓝牙概述 (3) 二、系统分析 (5) 2.1 需求分析 (5) 2.2 技术基础 (5) 2.3 平台搭建 (8) 2.4 运行环境 (11) 三、系统总体设计 (12) 3.1 设计思想 (12) 3.2 设计框架 (13) 四、程序设计 (16) 4.1 设置蓝牙权限 (16) 4.3 设置蓝牙可见 (16) 4.4 查询已配对蓝牙设备 (17) 4.5 扫描周围蓝牙设备 (17) 4.6 服务器端的连接 (18) 4.7 客户端的连接 (19) 4.8 数据通信线程 (20) 五、系统测试 (22) 六、设计体会 (26)

一、系统背景 1.1 Android系统概述 自从2008年9月22日,美国运营商T-Mobile USA在纽约正式发布了第一款基于android安卓的手机后,更多的移动设备厂商看到了安卓android的光明前景,并纷纷加入其中,android甚至已经涉足上网本市场了其发展前景广阔涉及领域越来越大。随着android手机的普及,android应用的需求势越来越大,这个潜力巨大的市场,已经吸引无数软件开发厂商和开发者投身其中。android 的开放性使其比苹果和黑莓对年轻人更具吸引力,更能吸引年轻人群的关注和喜爱。在18岁至24岁族群中,Android是最多人选用的操作系统。同时因为Android 系统的开放性为Android平板电脑的快速发展奠定了基础,也才能促使其吸引着越来越多的用户接受和使用。同时Android还具有应用程序无界限、应用程序是在平的的条件下创建的、应用程序可以轻松的嵌入网络、应用程序可以并行运行等众多出色的品质。具有其他操作系统无法比拟的优势和发展空间。 安卓系统在不断升级完善,如今,平板电脑市场已成为Android与苹果IOS 除了智能手机领域之外争夺的第二个焦点。一直以来,多数新闻仍然显示iPad 在平板市场的霸主地位难撼。但是,以Android领头的平板电脑正以高速的增长对苹果iPad造成冲击。放眼整个平板市场,生产Android平板电脑的确是大势所趋。世界上所有的顶级设备制造商,三星、索尼、摩托罗拉、联想、LG、宏碁、HTC、华硕,几乎每一家都在卖Android平板电脑。 安卓给用户的触屏体验非常好,安卓手机在高端机领域泛滥的同时也在中低端机领域涉足,这将给安卓系统手机带来非常好的前景,从目前的市场上来看,安卓系统能够在短短的时间里面,占据着超大的市场份额,而且还有非常好的信誉口碑,绝对不是一两个人吹捧出来的,那是因为安卓手机真的能够让人体验到好,才能够有如此高的评价。所以说,虽然目前安卓手机还是存在一定问题上的不足,很多问题都有待需要改善,这就说明安卓系统处于一种发展状态,那么它的生命力就会很强,前景很广阔。 Android是一套真正意义的开放性移动设备综合平台,它包括操作系统、中间件和一些关键的平台应用。Android的Java程序运行环境包含一组Java核心函数库及Dalvik虚拟机,他们有效地优化了Java程序的运行过程。Android系

相关主题
文本预览
相关文档 最新文档