班-以学号姓名_第1页
班-以学号姓名_第2页
班-以学号姓名_第3页
班-以学号姓名_第4页
班-以学号姓名_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Ⅳ、主要参考资料[1][1]RetoMeier著,译.Android4高级编程出版社[2][2]G.Nudelman著译AndroidUI设计模式[M].人民邮电版社[3].疯狂Android讲义[M].电子工业 M.Owens,G.Allen著 ,谢志强译 指南电子工业 [6][6]O.Cinar著.于红,冯艳红.AndroidC++高级编程:使NDK[M].计算机学院(系) 毕业设计()时间:2014年3月3日至2014年6月3答辩时间:2014年6月10日 指导教师 教师或答疑教师(并所负责部分系(教研室 (签字 指导老师对电视的内容进行补充,从而改善传统电视的局限性。研究价值。本文设计并实现了一个用于匹配电视的Android客户端,能够实时对正AndroidUI组件实现客户端的图形界面。最后实现按钮、列表等特定UI元素的交互操作。第二,设计并实现客户端的功能。本文使用研究的一种音频技术对现音频提取算法的移植,并完成音频的提取和保存。最后需要将音频发送:Android,移动应用,匹配,音频DesignandImplementationofAdMatchingApplicationBasedonAuthor:Peng-feiTutor:RUANLiWiththedevelopmentoftechnology,mobileinligentdeviceshavebeenrapidlypopularized.TraditionalTVmediahasstartedtocombinewithmobileinligentdevices,andtheconceptoftheSecondScreenApplicationhasemerged.Throughsuchapplications,peoplecansupplementthecontentofevisionprogramstoimprovethelimitationsoftraditionalTVmedia.Sinceevisionadvertisingisanimportantwayforpromotingtheproduct,thesecondscreenapplicationsforevisionadvertisinghasagreatresearchvalue.ThispaperdesignedandimplementedanAndroidapplicationformatchingevisionadvertising.Thiscouldhelptoinstantlymatchtheevisionadvertisingwhichisplaying,andcouldprovideuserswithadditionalinformationwhichisassociatedwiththematchedad.Themaincontentsofthispaperincludethefollowingaspects:ly,itwastodesignandimplementtheuserinterfaceoftheapplication.Userinterfaceofmobileappsisanimportantfactorwhichcouldimpactusers'experience.Intheplace,itneededtocompletetheprogramoveralllayoutoftheapplicationandthedesignofeachinterfaceaccordingtothecharacteristicsofmobileapplications.ThenweusedtheabundantUIcomponentswhichwereprovidedbyAndroidtorealizethegraphicalinterfacesoftheapplication.Finally,itcouldrealizetheinteractiveoperationofspecificUIelementssuchasbuttons,lists,etc.Secondly,itwastodesignandimplementthecorefunctionalityoftheapplication.Inthispaper,weusedasortofaudiofingerprintingtechnologyofourlaboratorytomatchtheevisionadvertising.Intheplace,itneededtostudyaboutthewayofgettingaudiodataoftheevisionadvertising.Thenitneededtostudyhowtoimplementthetransplantationofextractionalgorithmoftheaudiofingerprint,andhowtocompletetheextractionandpreservationoftheaudiofingerprint.Finally,itneededtosendtheaudiofingerprinttotheserver-sideformatching,andtoobtainthematchingresultandadditionalinformation.绪 课题来 课题背景与意 课题背 课题意 国内外研究现 研究目标与研究内 研究目 研究内 的组织结 相关技术分 本章小 客户端的整体设 客户端需求分 客户端功能流 客户端整体框 本章小 客户端的具体实 客户端开发环 用户界面模块的实 用户界面的设计原 客户端整体布局方 客户端用户界面的实 通用组件的实 功能模块的实 服务框架的实 音频录制及预处理的实 提取及保存音频的实 匹配音频的实 数据库模块的实 匹配结果数据库的实 数据库通用接口的实 异步查询的实 本章小 客户端实 实验环 客户端安装实 用户界面模块实 功能模块实 数据库模块实 本章小 总结与展 工作总 工作展 参考文 绪住地址、、等琐碎而又非常重要的信息,使得电视的效果大打折扣。随着技术的发展,移动智能设备已经成为了集头、多、传感器、互联网、触摸屏等为一体的强大工具。IOS、Android等主流操作系统的不断更新和完善,使得各 以获取的信息。但是, 会影响的视觉效果,且辨识率较低,因此应用效果远不如互联密和检索等方面。通过数字技术,可以提取音频、、、文本等数据的数字电视一般具有多个要素,如音频、等,因此采用数字技术对进行除此之外,还可以对其它电视进行匹配,增加的多样性和。例如电视剧时,用户可以获取时间、演员表、剧情、花絮等附加信息,同时将自己的心情到社交网络。据Yahoo部门在2011年1月的一项研究[6]显示,86%的移动互联网用户会在收看电视使用自己的移动设备,如图1.1所示。同时,有23%使用移动设备的用户表示他们浏览的内容与他们所看的电视相关。第二屏应用[8]作为移动互联网的一个热门趋势,许多公司都在考虑如何将电视的服务扩张到电视领域。另一款基于地理位置机购物应用Shopkick,也将自己的商业模式推广到了电视这个巨大的市场。同时,一些发布的第二屏应用也得到了用户的认可,如电视识别应用WiO等。这些应用都采用了音频技术来识别电视,但是由于其商业性质,算法都没有公开。以下是这几个应用的具体功能、图1.1用户电视时利用移动互联网进行的活动1、秒钟,它就可以返回这首歌的名字、歌手、所属专辑等信息。目前,Shazam曲库的歌图1.2音乐识别应用WiO是一款由WiOffer公司推出机应用,目前只有IOS版本,如图1.4所示。用户可以通过WiO立即了解当前的电视或的相关信息。电视商业在WiO上的方式如下。首先,商向WiOffer公司提供其商业或中植入的部分;然后,WiOffer公司为这段添加一个数码标识,这样安装了WiO应用程序机能够在电视时,通过对进行匹配,从而为消费者提供关于该产品的商可以通过WiO为用户提品券、图1.4WIO主界面的目标是基于Android系统,设计并实现一个界面简洁美观的电视匹配客户端(下文简称客户端),能够支持音频录制,音频数据预处理,提取、发送音频,接匹配系统,用于改善传统电视的交互性。第一,客户端的UI框架。简洁美观的UI是移动应用程序设计中最基本但又十分重UI布局,并利Android提供的各UIUI界面。果将耗时较长的任务直接放在GUI线进行处理,就会造成GUI线程阻塞,导致应移到子线完成,并通过子线程与GUI线程之间的通信来更新UI界面。这部分需要研究如何利用Android的组件来完成服务模块及线程之间的通信。第四,音频的提取和。为了提高效率,音频提取算法的部分采用C++编写。首先需要编写相应的接口,并将其编译成动态库,以便在匹配客户端中进行调用。提取音频时,Android端将预处理得到的音频数据传入C++函数,完成音频的计算后将结果返回给Android端并按指定格式为文本文件。在这个过程中,所有文件操作及音频的预处理都由Android端完成。第五,匹配结果的保存和查询。得到匹配结果后,需要将其在本地,以便用户查询。在这一部分,需要研究Android的持久化数据原理,设计并实现匹配结果的实现,最后对其进行了实验和测试。的组织结构如下:了的研究目标和研究内容。用程序组成,开发框架,Android本地开发等相关知识。块划分,分别讲述了用户界面模块、功能模块和数据库模块的实现方法。相关技术由于匹配客户端是基于Android系统开发的,因此需要对Android的系统架构、应用程序组成、开发框架等有足够的了解。本章主要介绍客户端的设计过所Android是一个Linux为基础的开放源代码操作系统,主要用于移动设备,如智能和平板电脑,由公司和开放及开发。从2008年10月第一款Android发布至今,已经有超过10亿部移动设备采用了Android系统,使其成为全球第一大智能操作系统。不过经过多年的发展,Android的概念已经不再是一个单独的操作系统,而是一个由3个部分组成[1]:Android最引人注目的是它的开放理念。通过一系API库,所有应用程序都可以Android系统与其他操作系样,采用了分层的架构,如图2.1所示。从图中可以看出,AndroidLinux内核层、运行库层、应用1、Linux图2.1ANDROID系统架构图程序库。在内核之上,包含了各种C/C++库(例如libc和SSL),以及图形库、多、外观管理器、Webkit、等程序库。系统运行库。Android运行时,可以让一个Android从本质上与一个移动Linux实现区分开来。由于Android运行时包含了库和Dalvik虚拟机,因此,它是库。提供了Java编程语言库的大多数功能。每一个Android应用程序都在它自己的进运行,并且都拥有一个独立的Dalvik虚拟机实例。Dalvik虚拟机。Dalvik是一个基于寄存器的虚拟机,它已经被优化从而确保一Linux内核进行线程和底层内存管应用程序框架提供了用来创建Android应用程序的类。它还对硬件提供了一般的抽象,并管理用户界面和应用程序资源。下一节中,具体讲述Android应用程应用层在运行在Android运行时内,并且使用了应用程序框架中可用的类和服务。在Android中,所有应用程序都有着同样的优先级。第和本地应用都使用相同的API并使用相应的第应用程序来替代,比如主屏幕、等。Android应用程序由松散耦合的组件组成,并使用一个Manifest文件——AndroidManifest.xml绑定到一起。Manifest文件在项目层次中的最底层,它描述了和平台要求、外部库以及必需的权限。以下是Android应用程序的基本组成部分。1、Activity是应用程序的表示层。应用程序中每一个UI都是通过Activity类的一个或2、户进行交互的任务(如音乐、网络等)。3、Intent是一个强大的应用程序间的消息传递框架。Android中大量Intent,它可以用来启动和停止Activity和Service,在系统范围内向目标ActivityServiceBroadcastReceiver广播消息,以及请求对特定的一条数据执行操作。4、Broadcast顾名思义,BroadcastReceiver就是广播,它可以让应用程序可以到那些收到的Intent,这个特点使它成为了事件驱动程序的最佳选择。5、的首选方法。对于一个任务较多的应用程序,Notification是一个很实用的功能,让用户能够及时获知任务的处理进度。例如一个运行在网络程序,当任务完成后,可以通过声音、振动、闪灯或滚动显示消息的方式来提醒用户。6、Content提供了几个有用的数据库,例如和联系人信息等。Android数据在开发Android应用程序之前,需要并安装JDK(JavaDevelopmentKit,JavaAndroidSDK包含了众多开发工具和实用程序,可以帮助开发者创建、测试和调试强大的调试工具,可以监视和控制那些能够调试应用程序的Dalvik模拟器。ADB(AndroidDebugBridge,Android调试桥)。ADB提供了对虚拟设备、实际设备的,允许文件、安装已编译的应用程序包以及运行s命令。 IInterface,Java本地调用)标准即可。

Java集成了Android交叉编译环境,并提供了一套简单易用的Makefile。通过这些工具,开发者可以快速构建C/C++动态库。同时,NDK能自动将编译好的so动态库与Java代码一起打包成Android应用程序安装包(.apk),为开发者节省很多时间。本章主要介绍了在匹配客户端的设计与实现过所涉及的理论基础和相关技术。2.1Android的概念和发展做了简单的介绍。2.2Android的系统架AndroidSDK,并列出了一些重要的工具包。2.5Android的本地开发工具NDK。客户端的整体传统的电视依然是大部分人业余时间的一个重要消遣。电视作为电视中不可或缺的一部分,对于商家、和观众都有着很大的影响。另一方面,功能丰富、在电视的同时,都会使用自己的移动智能设备做一些自己喜欢的事情。因此,越来越多的开发商都在尝试将电视和应用结合起来,出现了社交电视[7]和第二限。例如电视,人们通常只能记住的品牌,对于、和具体的商品信息Android系统设计并实现一款移动应用,使用户在是采用实时录制的电视音频进行匹配。以下是具体的功能需求。2、利用实时录制的音频完成匹配。首先需要采用移动设备的功能获取正以让人接受的。因此需要利用现有的算法提取一段可以代表音频样本的音频,将其图3.1客户端功能流程音频,同时将其保存到文本文件中。模块、功能模块和数据库模块。图3.2是客户端整体框架的示意图。图3.2客户端整体框架功能模块。该模块包含了客户端服务框架、获取原始音频数据、封装原始音频数据、对音频文件进行预处理、提取音频并保存、音频的匹配据库用于保存匹配结果,使用了Android的内置数据库;底层接口用于本章主要讲述了客户端的功能需求和整体设计。3.1节对客户端的功能需求进行了客户端的具体块、功能模块、数据库模块的具体实现方法。AD(AndroidAndroid进行客户端的开发,它包括了Eclipse、SDK和DDMS等一系列工具。下面是具体的开操作系统:WindowsADT版本:AndroidDeveloperToolsJAVA版本:Java7UpdateAndroidAPI版本:AndroidAndroidNDK版本:AndroidNDK通过Android提供的UI组件完成客户端各界面的具体实现。用户界面设计的要求越来越高。在设计用户界面时,应该遵循以下基本原则:的布局方案,如图4.1所示。图4.1用户界面整体布局方案如设置界面和结果展示界面,为了保持风格一致,仅去掉了TAB选项卡和操作栏Android应用程序的用户界面是由以下元素组成的一般采用XML文件来描述。ActivityActivity中,可以控制布局和显示UI,并响应用户的动作。3、获取用户界面中指定UI组件的,为其添加显示内容或交互操作。持,通过继承ActionBarActivity的方式创建主界面的类MainActivity:publicclassMainActivityextendsMainActivityActionBarActivity,因此已经默认启用了操比较简单,因此主要讲述操作栏右侧菜单的实现方式。界面,退出按钮用于关闭用户界面并结束线程。首先需要创建一个XML文件,用 <itemandroid:id="@+id/action_settings"<itemandroid:id="@+id/action_exit" 其中,结点为菜单的根结点,item结点为每个菜单按钮的描述,可以通过item的icon、title等属性指定菜单按钮的图标、名称等。然后,通过MainActivity的onCreateOptions 过以下方式描述菜单的XML文件: publicboolean Item{intid=item.getItemId(); idswitch(id){case//case////}}ActionBar对象,并使用该对象的setNavigationMode方法启用TAB选项卡:ActionBaractionBar=getSupportActionBar();其序号返回不同的Fragment子界面进行展示。2、退出完全退出应用程序时,会销毁当前界面并终止所有服务,因此需要使用框通过继承DialogFragment类的方式来创建一个ExitDlgFragment类:publicclassExitDlgFragmentextendsExitDlgFragment类通过onCreateDialog方法返回框的实例。在onCreateDialog<RelativeLayout /apk/res/android"<ImageViewandroid:id="@+id/app_bg_img"<TextViewandroid:id="@+id/op_step"其中ImageView是用来填补空白的,TextView用来展示匹配的进度,Button了设计。虽然可以直接使用当作按钮背景,但是考虑到在不同分辨率的设备中首先创建一个XML文件,通过layer-list创建一个资源,按钮的形状。在layer-list中,所有item中的形状可以通过层叠组一个新的形状。 /apk/res/android"<shapeandroid:shape="oval"<solidandroid:color="#BFFF"<item><!--其中selector的每一个item代表了一种状态。 /apk/res/android"<itemandroid:state_enabled="true"android:state_focused="false"<layer-list><!--/layer-<itemandroid:state_enabled="true"android:state_pressed="true"<layer-list><!--/layer-就是使用列表。虽然可以在一般的Fragment中直接使用列表视图来实现,但是Android提供了ListFragment来简化实现过程。publicstaticclassHistoryFragmentextendsListFragment然后为HistoryFragment创建一个布局<LinearLayout <ListViewandroid:id="@id/android:list"<TextViewandroid:id="@id/android:empty"在匹配结果时,则展示TextView中的内容。<LinearLayout <TextViewandroid:id="@+id/item_date"<LinearLayout<TextViewandroid:id="@+id/item_result"HistoryFragment中通过onListItemClick方法为每个列表条目绑定点击事件。当匹配成功后,会返回一个与匹配结果相关的URL地址,需要实现一个结果高性能浏览器,用于在Activity中直接展示网页。下面讲述如何利用WebView实页,TextView用于展示匹配失败时的信息,默认是隐藏的:<RelativeLayout /apk/res/android"<WebViewandroid:id="@+id/details_wv"<TextViewandroid:id="@+id/details_tv"android:visibility="gone"最后在DetailsActivity中获取WebView的,通过WebView的loadUrl方法就可以加载指定的URL地址:WebViewwv=(WebView)findViewById(R.id.details_wv); 可以直接在DetailsActivity中打开该网页。设置界面用于设置客户端的首选项,Android使用了一种简单的持久化数据方创建设置界面。PreferenceActivity框架主要由以下几个部分组成:控件、运行的值和每个控件的SharedPreference键。PreferenceActivityPreferenceFragment,用来显示PreferenceScreenSharedPreference变化程序,用于SharedPreference的变化,保证设置PreferenceScreen布局,使用PreferenceCategory将相同类型的设置合并到一起<PreferenceScreen /apk/res/android"<PreferenceCategoryandroid:key="pref_key_category_msg"<CheckBoxPreferenceandroid:key="notification_checkbox"<CheckBoxPreferenceandroid:key="notification_sound_checkbox"<PreferenceCategoryandroid:key="pref_key_category_func"<ListPreferenceandroid:key="pref_audio_len"<ListPreferenceandroid:key="pref_audio_interval"<ListPreferenceandroid:key="pref_audio_number"第一个PreferenceCategory使用了两个复选框来设置是否允许客户端触发通知及是否开启通知和振动效果;第二个PreferenceCategory用于设置匹配时的<string-array</string-publicclassSettingsActivityextendsPreferenceActivity 应的情况,需要将它们移到子线完成。本节首先讲述如何实现一个用于执行不可见任务的服务框架,然后讲述如何实现音频录制、提取等主要功能,最后讲 即使在UI不可见的时候也可以保证应用程序的持续运行。另一方面,由于Service跟Activity一样,运行在应用程序进程的主线,因此对于耗时较长的任务,同样需要Service中创建子线程来执行。IntentServiceService的包装类,可以接收一个包含完成任务所需参数的Intent,并直接在子线执行指定的任务。因此在匹配客户端中,使用IntentService实现服务。publicclassMatcherServiceextendsAndroid:enabled="true">Intentintent=newIntent(this,MatcherService.class);此时,即便用户关闭了客户端的用户界面,Service中的任务也将在继续执行。在Android应用程序中,不能在子线直接更新UI元素,需要使用一些方法证子线程与GUI线程同步。Intent是一个系统级的消息传递机制,同时可以通过新UI元素。如图4.2所示。图4.2服务示意图publicclassMatcherReceiverextends作的Intent。同时,新建一个MatcherReceiver的实例receiver。在匹配客户端中,需要过滤动作为“STEP”的Intent:privateIntentFilterfilter=newIntentFilter(“STEP”);privateMatcherReceiverreceiver=newMatcherReceiver();最后,需要使用函数registerReceiver和unregisterReceiver在UI界面不同的生命周期对分别对receiver进行和注销。时,需要指明使用的过滤器filter:registerReceiver(receiver,filter);//BroadcastReceiverunregisterReceiver(receiver);//BroadcastReceiver后通过sendBroadcast函数进行广播:IntentstepIntent=new//stepIntentBroadcastReceiver通过onReceive函数来广播并触发相应的事件处理函数,因此只需重写MatcherReceiveronReceive函数,添加对客户端UI更新操作。匹配过,需要更新的UI元素是主界面中用于描述匹配状态的文字视图。默认应用程序中,Notification是那些不可见的应用程序组件(BroadcastReceiver、Service、非活动状态的Activity)提醒用户的首选机制。它有以下这些功能:LED闪烁、让振动、发出声Notificationn=在匹配客户端中,需要根据应用设置中和振动”选项来判断是否需要配置Notification和振动选项另外通过setContentIntent函数可以为Notification得对它的:Stringsn=NotificationManagernm=(NotificationManager)把一个Notification和一个整型ID一起传递给NotificationManager的notify方频的音频数据。在Android中,提供了两个可以实现的类:MediaRecorder和AudioRecord。其中,MediaRecorder类的使用方式比较简单,但是支持的音频格式较少,而且得到的音频都是经过压缩的,质量不高,无法用于提取音频。AudioRecord类则可以直接从硬件缓冲区录制音频获取PCM编码的原始音频数据因此采用AudioRecord获取原始音频数据,然后封装为wav格式,以便提取音频。类图如图4.3所示。图4.3AUDIORECORDER类图isRecordingtrue,audioTimeLen设置为应用设置中“音频长度”的值。AndroidAudioRecord类是直接从硬件缓冲区获取音频原始数据,因此还需AudioRecord类的getMinBufferSize函数获得。然后,创建一个AudioRecord对象等参数。执行audioRecord的startRecording函数即可开始:之后,创建一个判断条件为isRecording的循环,并在这个循环中不断通过任务中,需要做的事情是将isRecording设置为false。最后经过audioTimeLen所指定的时间,Timer将触发执行TimerTask中的任务,把而使音频的长度刚好为audioTimeLen的值。以在其它平台或中进行处理,选择将原始音频数据和音频的基本信息封装为wav格式。其中,数据部分通常采用无压缩的PCMrecord方法获取原始音频数据的编码方式一致;文件头部分则包含了音频数据的编码参数。因此,只需要在原始音频数据的头部添加一个描述音频信息的wav文件头,就可以得到标准的wav文件。在AudioRecorder类中,使用getWavAudio函数将原始音频文件封装为标准wav音频文件。参考附录A中标准wav音频文件的文件头格式,可以发现文件头的大小为4444的字节数组,然后标准的文件头格式,将录制音频时wavwav音频文件。与录制指定长度的音频一样,通过Timer和TimerTask来实现这个功能。首先分别创建一个Timer和TimerTask对象,在TimerTask的任务中,需要做的事情是开始后,Timer的周期设置为应用设置中的“音频长度”与“间隔时间”之定的间隔时间,Timer循环就会自动开始下一段。图4.4为这个过程的示意图。图4.4连续录制多段音频示意图通过以上方法,就达到了连续录制多段音频的目标,同时每一段都是在一添加一个成员函数readWav,用于wav音频文件并进行预处理。数据,使用Java语言的DataInputStream类创建文件读入流来处理wav音频文件。DataInputStream支持直接long,int,short,char等类型的数据,并可以通过skipBytes首先wav音频文件的文件头,由于只需要几个特定的音频参数,如采样频率、声道、量化位数等。因此,可以参照附录A中标准wav音频文件的文件头格式,使用skipBytes函数跳过不需要的字节,直接获取所需的参数。然后,假设wav音频文件的数据部分大小为N个字节,采样点数为m。需要表4.1所示。表4.1大小相同参数不同的WAV音频8N8mdoubleaudioValue来保存最终结果,并用来传递给音频指由于提取音频的过需要进行大量的运算,为了提高程序的运行效率,音频时将返回的音频保存在文本文件中。构建C++音频提取算法动态库时,需要做一些额外的工作。publicnativestaticint[]getFp(double[]audioValue,intfrequency);audioValue为对wavfrequency为wav音频文件的采样频率。getFp函数的返回值是一个intwav音频文件的音频。magicadC++AudioJNIgetFp函数,并完成参数类型的转换。主要代码如图4.5所示。图4.5C++接口函数主要代码首先需要引入JNI头文件“jni.h”和音频提取算法头文件“Fingerextract.h”,述代码中_felix_magicad_AudioJNI_getFpAudioJNI类中的getFp函4.2是对代码中用到的表4.2JAVA数据类型与JNI数据类型的转换对照 对它的,才能将这些参数传递给音频提取算法。在上面的代码中,采用的数组fp中以返回给Java代码。 完成接口的编写后还需要将C++接口文件和所有音频提取算法的C++代码构建(),用于在程序中进行快速变换。虽然FFTW提供了可以Linux、WindowsAndroid设备的处理器架构与平台的库,最终得到一个头文件fftw3.hlibfftw3.a。选中的文件为音频提取算法所包含的C++头文件(.h)和C++源文件(.cpp)。magicad.cppJNI接口文件,fftw3FFTW图4.6C++文件列表FFTW库,需要使PREBUILT_STATIC_LIBRARY将其预构建fftw3Android.mk4.7所示。图4.7FFTW3MAKEFILE文件描述其中LOCAL_MODULE为得到的静态库的名称,LOCAL_SRC_FILES指明进行Android.mk文件,就可以将fftw3.hlibfftw3.a一起预构建成静态库fftw3。最后在音频提取算法源文件所在的 的Android.mk文件,其内容如图4.8所示。图4.8所有C++文件的MAKEFILE文件描述参数。同时,通过下面这条规则了fftw3文件夹中的Android.mk文件:include$(callall-subdir- 描述,构建音频提取算法动态库libmagicad.so。如图4.9所示。图4.9SO动态 图4.10SO动态库的使用方法频的频率作为参数传递给AudioJNI类的getFp函数,就可以进行音频的提取。该算法提取了两个大小不同的音频,第一个的大小为256位,第二个的大小为32*256位,其合并到了一个大小为256+32*256的数组中。得到返回的数组后,再将数组中的两个音频分别保存到两个文本文件中。会返回一个与该电视相关的url地址,用于在客户端中进行浏览。若匹配失败,则匹配时,是使用已有的通信模块将保存音频的文本文件发送到服务器端。其中通信模块提供了一个SocketHelper类,只需要将这个类加入到匹配客户端的项SocketHelpersocket=new同时,服务器端对音频进行匹配后,send函数会返回一个字符串:Stringresult= 表匹配成功,此时result的值是一个与成功匹配的内容相关的url地址。同时,Android提供了一系列的方法来简化使用数据库的过程。下面讲述返回失败标志。因此只需要在数据库中保存匹配结果的时间、结果标志和附加。其详细设计如表4.3所示。表4.3数据库表的设否是否否否否能否类图如图4.11所示。图4.11DBHELPER类图其中,DB_NAME为数据库的名称,DB_VER为数据库的版本,TB_RESULTS为表的名称,DB_CREATE为创建数据库时的SQL语句。在onCreate中进行数据库SQL4.12图4.12创建匹配结果表的SQL语句且可以通过ContentResolver进行查询和执行事务。publicclassResultProviderextends在ResultProvider中,需要重写onCreate方法来初始化底层的数据源,同时通query、update、delete、insertgetTypeContentResolver与数据进行ResultProvider的类图如图4.13所示图4.13RESULTPROVIDER类图同Activity和Service一样,ContentProvider必须在Manifest文件中进行。否则,ContentResolver将无法找到ContentProvider。代码如下所示:Android:authorities="com.felix.resultprovider">图4.14MATCHRESULT类图其中,date为日期信息,是通JavaDate类获取当前日期并格式化得到的;result为结果描述;link为附加的URL。result和link都是在MatchResult类的构造函数然后在需要添加匹配结果的类中创建一个函数addResult。addResult函数使用一个MatchResult对象作为参数,并在其中调用ResultProvider的insert函数将匹配结果最终,在获得匹配结果之后,使用其结果描述和URL作为参数新建一个来异步加载数据和底层数据源的变化。CursorLoader是Loader的一个扩展,允许ContentProviderCursor,而且对底层提供的任何更。通过LoaderManager可以在每个Activity或Fragment中使用CursorLoader在将加载的类型显式地指定为Cursor。。publicstaticclassHistoryFragmentextendsLoaderCallback由以下3个处理程序组成: oader:当Loader被初始化后,调用onCrea 该创建并返回一个新的CursorLoader对象。OnLoadFinished:当LoaderManager已经完成了异步查询后,onLoadFinished配器和其它UI元素。onLoaderReset:当LoaderManager重置CursorLoader的时候,会调用且重置相应的UI。图4.15HISTORYFRAGMENT类图为了将所有匹配结果加载到HistoryFragment的列表视图中。需要先在History图,同时指定需要使用的Cursor。LoaderonLoadFinishedCursor与原来的结adapter也会在CursorHistoryFragment的内本章主要讲述了客户端各个模块的具体实现方法。4.1节讲述了在实现客户端的过所使用的开发环境和版本。4.2节、4.3节和4.4节分别讲述了利用相关的技术和知识实现客户端用户界面模块、功能模块和数据库模块的方法。客户端试和验证。首先介绍实验的环境,然后分别对各个模块进试,并验证客户端的根据需要,在真实的Android设备上对客户端进试和验证,下面是实验环CPU:MTK8312ARMCortex-A72、环境操作系统:Android数据库管理工具: al将安装文件(.apk)到Android设备的卡中从图中可以发现,客户端请求了“”、“读写SD卡”和“网络”等权限,与在实现过所需的权限一致。图5.1项目源文件结构图5.2安装提示生成Android应用程序安装文件。同时在Android设备上安装匹配客户端时,成功5.3可以发现,首页界面的布局和“开始”按钮的形状都与图5.3首页界面界面和历史记录界面,实验结果如图5.4所示。图5.4TAB选项卡“确定”按钮才会完全退出程序,实验结果如图5.5所示。图5.5退出知,其实验结果如图5.6所示。图5.6通知3、验证结果展示界面。将“

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论