基于android设备投屏TV功能实现_第1页
基于android设备投屏TV功能实现_第2页
基于android设备投屏TV功能实现_第3页
基于android设备投屏TV功能实现_第4页
基于android设备投屏TV功能实现_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

绪论1.1项目背景随着抖音、快手等小视频移动软件的兴起,手机、平板进行各种娱乐活动已经成为了许多人闲暇的娱乐工具。但是,当遇到自己喜欢的视频和电视的时候,想和自己的亲人、朋友分享时,手机和平板这些小屏幕设备就显的有点捉襟见肘,并且手机也不能很方便的从其他智能设备上获取多媒体资源,使得用户互动可能性降低。手机投屏互动技术就是在此种情况下诞生。手机投屏在专门的协议、同一局域网下,实现了不同智能终端之间进行画面显示、音频播放和遥控器控制的功能[1],用户可以通过该技术实现手机等移动设备获取其他智能设备的多媒体资源,也能将手机本地多媒体资源、获取到的其他智能设备中的多媒体资源推送到智能电视大屏幕上进行观看。自从Android操作系统在2007年发布,搭载着Android系统的智能设备发展飞速[2]。在最近几年中,具有高性价比、硬件多选性、开源等优势的Android操作系统又快速进军了家电市场。在没有Android操作系统的家电设备中,商家也为其生产的家电设备提供了可扩展的接口,方便兼容Android操作系统。HDMI接口就是其中一个。从目前来看家电领域已经被Android操作系统所覆盖。正因为越来越多的智能设备都搭载Android操作系统,Android应用程序开发也被带动起来了。为了实现生活更加便利、快捷、智能,许许多多的公司和个人在Android系统的基础上进行不断的研发,以便能研发出更加方便、智能的App。Android智能设备投屏功能就是本次开发的重点。1.2项目介绍在不同的多媒体终端上(如手机、PAD、TV等)利用相同的网络上层协议(比如DLNA、Airplay、Miracast等)通过WIFI热点网络对图片、音视频进行传输、解析、显示和控制的技术叫多屏互动技术。在不同设备上实现了资源共享。只要智能设备上安装了相应功能,手机、PAD或个人PC上的资源文件就可以随时分享到电视上进行观看。而且,大小屏幕切换自如,满足了人们在日常生活、会议、教学旅行、住宿类似需求。1.3投屏智能电视的几种方法1.3.1DLNADLNA是由索尼、英特尔、微软等发起成立的DIGITALLIVINGNETWORKALLIANCE(数字生活网络联盟)研发的,主要实现移动设备、个人PC、家庭电视在内的无线网络和有限网络的互通互联[3]。1.3.2Miracast以Wi-Fi直连为基础的无线显示协议Miracast于2012年通过Wi-Fi联盟所制定。智能设备使用此协议以无线方式实现视频画面的分享。通过Miracast协议,智能手机可在不受连接线缆长度影响的情况下将影片或照片播放在电视屏幕上。拥有类似于AirPlay的镜像功能的Miracast是与DLNA不同的功能,该功能可实现在高清电视屏幕里投放智能手机屏幕中的内容,这样也就可以观看电视屏幕来实现玩游戏的乐趣。该功能在Android4.2及以后的版本中成为了标配(要找到此功能需要到智能手机设置或显示菜单中去找,如:Wi-FiDisplay、Miracast、Mirroringscreen、无线显示等)。通过无线显示接收器可以将智能手机屏幕画面无线传输到客厅电视或者会议室投影仪上。画面传输延时150ms以下,几乎同时。当点击此功能时,智能设备没有任何反应,因为此项功能需要配件支持。1.3.3AirPlay苹果开发了一种通过WiFi将iPhone、iPad、iPodtouch等IOS设备上的包括但不限于图片、音频、视频无线传输到支持AirPlay的智能设备上的技术叫AirPlay。AirPlay镜像是AirPlay与DLNA不同指出,iPhone或iPad可以用AirPlay镜像功能将画面无线传输到AppleTV电视上,当iPhone或iPad显示不同画面的时候,AppleTV电视屏幕显示和iPhone或iPad一样的画面。并且可以用iPad当方向盘看着大屏玩游戏。另外实现双屏游戏是AirPlay镜像最强大的功能,让用户能在游戏中有更宽广的视野,例如。当电视里显示游戏画面的时候,另一个设备上显示的是鼻塞的路线图。1.3.4GoogleCast因为国内的手机基本都是阉割版本的。因为不需要使用GooglePlay,所以国内很多手机需要下载好谷歌的三件套才能使用,然后就是谷歌官方的硬件Chromecast,在国内基本很难用,因为要用访问谷歌的服务器,所以需要外网才行[5]。1.3.5DLNA和Miracast区别DLNA和Miracast的区别是前者是基于文件的,后者是实时的。媒体文件通常由各种编码格式,而播放器为了播放媒体文件是需要处理这些编码格式的。为此,DLNA为了比较好的播放体验,会显缓存一小段时间[4]。Miracast通过实时传输源端的输出将源端的操作传输到接收端,如果源端是播放媒体文件,则源端需要先即将媒体文件进行解码,在编码成H.264的格式通过Miracast将编码后的数据无线传输给接收端,然后接收端在对H.264进行解码操作,并展示到接收端屏幕上。在WiFi通路方面,Miracast比DLNA的要求更高一些。因此本文以DLNA作为功能实现的架构。2相关理论与技术DLNA是由索尼、英特尔、微软等发起成立的DIGITALLIVINGNETWORKALLIANCE(数字生活网络联盟)研发的。主要实现移动设备、个人PC、家庭电视在内的无线网络和有限网络的互通互联。在DLNA协议中,通过UPnP协议实现部分核心设备的发现和控制[6]。而Cling是一款封装DLNA协议的设备搜索、设备连接和设备控制的开源框架库。因此本章将会介绍DLNA协议标准和Cling开源库实现投屏的技术。2.1DLNA协议标准2.1.1DLNA设备类型在不同应用领域中,可以将DLNA所支持的设备分成三大类,分别是移动网络设备,家庭网络设备和家庭互操作设备[7]。家庭网络设备包括5个类型,分别是数字媒体服务器、数字媒体播放设备、数字媒体渲染设备、数字媒体控制器和数字媒体打印机[7]。移动手持设备也包括5个类型。分别是移动数字媒体服务器、移动数字媒体上传设备、移动数字媒体播放器、移动数字媒体下载设备以及移动数字媒体控制器。家庭互操作设备包括两种类型,分别是移动网络连接功能设备和移动互操作单元。2.1.2DLNA分级结构下图是将DLNA各个层次标明了标准和包括各项内容进行阐述的分级结构图,如图2-1。图2-1DLNA分级结构图网络连接层网络连接层包括无线网络、有线网络和蓝牙等,它定义了所接入网络的类型和协议,是整个结构图的最底层。DLNA支持网络类型为802.3i/u的有线网络,网络类型为802.11a/b/g的无线网络,以及蓝牙技术。网络协议DLNA是在IP技术的基础上实现的,且当前已被广泛使用的网络技术基础协议是IPv4协议,因而DLNA必须支持IPv4。设备的发现、控制及媒体管理DLNA框架的核心模块是发现设备、控制设备、媒体管理,而实现这一核心功能主要靠UPnPDA和UPnPAC这两大框架。UPnPDA框架中包括简单服务发现协议SSDP和简单对象访问协议SOAP。而SSDP是为局域网中感兴趣的设备提供服务,SOAP主要为设备发送控制消息。对音频和视频的管理控制主要靠UPnPAV框架,并明确了各个支持DLNA的设备在多媒体传送过程中所承担的任务。媒体传输HTTP协议是带有DLNA功能设备必须支持使用的传输协议,而RTP协议是可以通过设备自己选择是否支持。媒体格式确定了DLNA支持多媒体格式包括图片、音频、视频和其他可选支持的格式。必须支持的格式是图片、音频和视频格式。而支持图片的格式包括JPEG,支持音频的格式包括AC-3、AAC、MP3以及WMA等。支持视频的格式包括MPRG-1、MPEG-4和H.264等格式。当前网络传输技术和多媒体压缩技术发展越来越快,今后DLNA产品支持的多媒体格式会越来越多。2.2UPnP协议栈工作原理2.2.1UPnP网络简介UPnP协议主要实现设备与设备之间网络互联的功能,是由“通用即插即用论坛”(UPnPForum)推广的一套网络协议。由设备寻址、设备发现、设备描述、设备控制、事件通知以及基于Html描述这几部分构成的UPnP协议是设备与设备之间,设备与控制点,控制点与控制点之间的通信的协议。2.2.2UPnP协议栈组成由多协议、多层次的设备模型构成的协议栈UPnP协议为了实现对局域网中的设备发现和控制,特将框架分为寻址、发现、描述、控制、事件和展示这六个步骤,且这当中每一步骤都定义属于自己的通讯协议[9]。为了实现能在不同开发语言、不同的操作系统编写和运行UPnP协议栈支持的应用程序,UPnP里的每个协议都是在成熟开放的标准协议(如IP、UDP以及TCP协议)之上建立的。下图为UPnP协议栈简略描述。图2-2UPnP协议栈组成(1)IP主要用到网络层数据的传输,IP层用于数据的发送和接收。两个设备互联其实就是网络互联,所以需要网络层协议。(2)TCP-UDP这里包含了UDP和TCP两块协议。如图2-3所示:图2-3UDP和TCP两块协议UDP协议与IP协议组合成:UDP/IP协议。而HHTPMU和HTPU这两个协议是基于UDP/IP协议之上的。TCP协议与IP协议组合成:TCP/IP协议。.Http则是基于TCP/IP协议之上。使用UDP,可以通过多点传送(Multicast)向LAN上所支持UPnP的设备发送新设备接入的通知,这里流媒体也会使用UDP来传输,因为速度快。所有的UPnP消息都是由HTTP协议基础上定义的HTTPMU协议和HTTPU协议来进行封装,并且用UDP来实现组播通讯。而UDP协议则是通过不断发送信息而不需要等待回复,因此很适用于直播类传输,但缺点是容易丢帧。因此使用UDP来通讯是为了能很好的播放高刷新率的媒体文件。(3)设备发现|设备控制|设备事件协议图2-4设备发现|设备控制|设备事件协议1)SSDP协议:简单服务发现协议在UPnP协议中,当用户连接到无线WIFI时,控制端能通过SSDP协议搜索到局域网络中感兴趣并且支持UPnP协议的设备并能为支持UPnP协议的设备提供服务。SSDP协议的主要功能时宣告设备存在和搜索服务和支持DLNA协议的设备,通过UDP协议多播或单播来实现了控制设备自动搜索感兴趣的支持DLNA协议的设备或服务、支持DLNA协议的设备里广播上下线消息、控制设备向支持DLNA协议的设备发送控制指令等功能。SOAP协议:简单对象访问协议(SimpleObjectAccessProtocol)。SOPA协议规定怎样使用XML和HTTP协议来执行包括控制设备发送命令消息给支持DLNA设备、支持DLNA设备收到消息后发送响应消息给控制设备的远程服务请求。在局域网络中,控制设备需要向支持DLNA设备发送包含需要调用的参数和函数的服务SOAP请求来获取描述文档。支持DLNA设备收到该服务SOAP请求后,支持DLNA设备会将包括设备的状态、返回的值和执行错误的信息等一些结果或者执行失败信息封装一个SOAP响应中并传输给控制设备。3)设备事件GENA协议:该协议主要是为控制设备获取监听设备在某个服务状态变化时传送订阅信息或接收返回的信息做一些规定。4)HTTPU和HTTPMU协议由UDP传输协议实现用于多播通信的HTTPMU协议和以UDP传输协议实现的HTTPU协议都是HTTP协议的衍生通信传输协议,因此,该协议适合由不同语言不同操作系统使用的协议。方便各种设备适配支持DLNA协议的设备。2.2.3UPnP工作流程下图是描述UPnPDA对设备的发现和控制大概流程,从下往上依次为寻址、发现、描述、控制、事件、展示。如下图所示。图2-5UPnP工作流程(1)设备寻址首先控制设备会其搜索DHCP服务器获取自己的IP地址,如果没有获取到IP地址,则使用LLA协议来获取IP地址。为了能更好的执行后续,寻址是必须的一步。当前Android操作系统会自动去获取IP地址,而我们现在所基于的操作系统正式Android操作系统,因此,此开发不需要考虑设备寻址。(2)设备发现当控制设备获取到自己的IP地址后,就可以在局域网种通过简单服务发现协议SSDP来寻找感兴趣并且支持了DLNA协议的设备及其上的服务。(3)设备描述控制设备发现支持DLNA设备后,能从种获取到支持DLNA设备服务类型、支持DLNA设备唯一标识和支持DLNA设备的描述文档的URL,并从支持DLNA设备描述文档的URL种获取更多支持DLNA设备的详细描述来实现控制支持DLNA设备之间交互。(4)设备控制基于SOAP协议实现控制设备通过网络请求来调用支持UPnP的设备上所提供的服务,获取到该设备的描述文档,解析支持UPnP设备上的描述文档来获取某个服务的控制URL、所需要函数名称、参数名称以及参数要求,然后控制设备向控制通过向URL传入函数名称、参数名称以及对应参数数据发出调用请求,支持UPnP设备收到调用请求后通过一系列操作后返回响应的结果或者错误信息,控制设备收到返回的响应数据完成响应操作来达到控制支持UPnP设备所提供能的功能。(5)设备事件设备事件就是控制设备通过订阅支持UPnP设备的事件,该事件就是让支持UPnP设备发送采用XML格式且遵守通用事件通知协议的规定的一个或多个状态变化值的事件消息来达到更新运行时状态信息的值,在订阅处能及时获取到支持UPnP设备在运行时的状态信息值。(6)设备展现当支持UPnP设备种带有显示URL的描述信息时,控制设备可以通过该URL链接来实现控制设备媒体文件展示在大屏显示器上[8]。2.3Cling框架Cling类库是由Java实现的DLNA/UPnP协议栈。基于DLNA/UPnP可以开发出类似多屏互动、资源共享、远程控制等功能的应用,通过Android应用管理一个或多个设备,将音频、视频、图片推送到指定设备显示。Cling作为UPnP协议栈,其主旨即是在设备的发现,控制等过程中对不同的协议及内容进行处理。UPnP协议栈由多个层组成,Cling只关心底层的TCP/IP协议以及包含SSDP(设备发现),SOAP(设备控制),GENA(设备事件)协议的层。3软件开发所需条件3.1开发环境及研究基础本软件是运行在Android系统上,需要使用Android开发语言来实现功能。且在Windows操作系统上使用Androidstudio开发IDE。在开发本软件之前,需要有以下研究基础。(1)掌握Android开发语言、多媒体开发技术以及AndroidstudioIDE使用流程,熟悉Android系统。(2)了解HTTP协议、TCP/IP协议和UDP协议,DLNA协议标准和UPnP协议(3)了解Cling第三方库。(4)熟练使用Android中各种第三方库和AIDL的知识,能熟练使用Service服务相关的功能以及Service与Activity相互通信的技术。3.2软件和硬件基础App运行环境如表3-1所示。3.3编程前配置3.3.1网络权限要实现网络请求以及IP地址获取,则需要使用到网络相关权限、WIFI相关权限程序唤醒权限等相关权限。如下为当前软件开发需要的权限。因下列权限不是运行时权限,不需要在使用时再去获取,可以直接在AndroidManifest中声明。无需其他操作。<uses-permissionandroid:name=”android.permission.ACCESS_WIFI_STATE”/><uses-permissionandroid:name=”android.permission.ACCESS_NETWORK_STATE”/><uses-permissionandroid:name=”android.permission.INTERNET”/><uses-permissionandroid:name=”android.permission.CHANGE_WIFI_MULTICAST_STATE”/><uses-permissionandroid:name=”android.permission.WAKE_LOCK”/>4搜索设备4.1设备搜索流程图代码实现设备搜索流程图。该软件是在Cling第三方库的基础上实现的,因此,我们只需要调用Cling开放出来的方法来实现相应的操作。先创建ClingManager对象,通过ClingManager对象来开启搜索设备功能SearchDevices。并实现BrowseRegisterListener监听器,重写其结果返回方法。当结果返回方法被调用,则能从其中获取到搜索到设备的信息以及是否搜索到了设备。然后可以在界面上进行展示。大概流程如下图。4.2UML图4.3功能实现本项目是在Cling库的支持下完成功能实现的。因此,上图中ClingUPnPService类继承Cling库下的AndroidUpnpServiceImpl类并实现里面的方法。ClingManager类中实现了搜索设备,获取控制点,设备显示和删除等功能。在MainActivity的中创建ServiceConnection对象,并实现ServiceConnection下的onServiceConnected和onServiceDisconnected两个方法。onServiceConnected方法下实行ClingUPnPService的对象创建,BrowseRegistryListener监听器对象创建,ClingManager.getInstance()来创建ClingManager类的对象,通过ClingManager对象设置UpnPService服务、DeviceManager和绑定设备搜索监听器,最后开启设备搜索功能。onServiceDisconnected当服务断开时,需要重新设置UPnPService的服务。在MainActivity类中的onCreate方法里面,需要创建ClingUPnPService服务的意图,并绑定当前服务。绑定服务后,需要在onDestroy中取消绑定。通过BrowseRegistryListener的对象调用setOnDeviceListChangeListener实现DeviceListChangeListener接口下面的方法onDeviceAdded和onDeviceRemoved两个方法。onDeviceAdded里面实现将设获取到的设备添加到设备的列表中。onDeviceRemoved实现当设备断开服务后删除列表中的设备。privateBrowseRegistryListenermBrowseRegistryListener=newBrowseRegistryListener();privateServiceConnectionmUpnpServiceConnection=newServiceConnection(){@OverridepublicvoidonServiceConnected(ComponentNameclassName,IBinderservice){ClingUpnpService.LocalBinderbinder=(ClingUpnpService.LocalBinder)service;ClingUpnpServicebeyondUpnpService=binder.getService();ClingManagerclingUpnpServiceManager=ClingManager.getInstance();clingUpnpServiceManager.setUpnpService(beyondUpnpService);clingUpnpServiceManager.setDeviceManager(newDeviceManager());clingUpnpServiceManager.getRegistry().addListener(mBrowseRegistryListener);clingUpnpServiceManager.searchDevices();}@OverridepublicvoidonServiceDisconnected(ComponentNameclassName){ClingManager.getInstance().setUpnpService(null);}};MainActivity类中onCreate方法里面绑定服务IntentupnpServiceIntent=newIntent(MainActivity.this,ClingUpnpService.class);bindService(upnpServiceIntent,mUpnpServiceConnection,Context.BIND_AUTO_CREATE);mBrowseRegistryListener绑定设备搜索监听回调,及时添加设备到设备列表中。mBrowseRegistryListener.setOnDeviceListChangedListener(newDeviceListChangedListener(){@OverridepublicvoidonDeviceAdded(finalIDevicedevice){runOnUiThread(newRunnable(){publicvoidrun(){mDevicesAdapter.add((ClingDevice)device);}});}@OverridepublicvoidonDeviceRemoved(finalIDevicedevice){runOnUiThread(newRunnable(){publicvoidrun(){mDevicesAdapter.remove((ClingDevice)device);}});}});5设备控制5.1控制流程图5.2设备控制UML图5.3设备控制代码实现5.3.1注册TV状态广播接收创建一个TransportStateBroadcastReceiver类并继承BroadcastReceiver,用来接受状态改变信息。通过Handler来切换线程实现控制和消息提示功能。mTransportStateBroadcastReceiver=newTransportStateBroadcastReceiver();IntentFilterfilter=newIntentFilter();filter.addAction(Intents.ACTION_PLAYING);filter.addAction(Intents.ACTION_PAUSED_PLAYBACK);filter.addAction(Intents.ACTION_STOPPED);filter.addAction(Intents.ACTION_TRANSITIONING);registerReceiver(mTransportStateBroadcastReceiver,filter);privateclassTransportStateBroadcastReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){Stringaction=intent.getAction();if(Intents.ACTION_PLAYING.equals(action)){mHandler.sendEmptyMessage(PLAY_ACTION);}elseif(Intents.ACTION_PAUSED_PLAYBACK.equals(action)){mHandler.sendEmptyMessage(PAUSE_ACTION);}elseif(Intents.ACTION_STOPPED.equals(action)){mHandler.sendEmptyMessage(STOP_ACTION);}elseif(Intents.ACTION_TRANSITIONING.equals(action)){mHandler.sendEmptyMessage(TRANSITIONING_ACTION);}}}privatefinalclassInnerHandlerextendsHandler{@OverridepublicvoidhandleMessage(Messagemsg){super.handleMessage(msg);switch(msg.what){casePLAY_ACTION:Toast.makeText(mContext,"正在投放",Toast.LENGTH_SHORT).show();mClingPlayControl.setCurrentState(DLANPlayState.PLAY);break;casePAUSE_ACTION:mClingPlayControl.setCurrentState(DLANPlayState.PAUSE);break;caseSTOP_ACTION:mClingPlayControl.setCurrentState(DLANPlayState.STOP);break;caseTRANSITIONING_ACTION:Toast.makeText(mContext,"正在连接",Toast.LENGTH_SHORT).show();break;caseERROR_ACTION:Toast.makeText(mContext,"投放失败",Toast.LENGTH_SHORT).show();break;}}}5.3.2获取控制点控制点包含在UpnPService里面,Cling对android做了一层封装AndroidUpnpServiceImpl,这个类里面就有UpnpService,我们可以通过获取UpnpService之后获取到控制点。我们的Activity可以绑定AndroidUpnpServiceImpl这个Service继承类,当onServiceConnected之后,我们就可以通过upnpService.getControlPoint()获取到控制点。我们通过绑定Service,然后将Service绑定到ClingUpnpServiceManager中,ClingUpnpServiceManager是一个单例对象,因为Service里面有获取控制点等方法,绑定到ClingUpnpServiceManager之后,我们可以直接通过ClingUpnpServiceManager来获取控制点等。同时我们在ClingPlayControl中封装了控制设备的各种方法(例如:播放、暂停、音量控制等)。创建一个AVTransportSubscriptionCallback的类,它继承SubscriptionCallback,SubscriptionCallback是Cling做的事件回调。用于接收tv端的通知信息。在eventReceived方法中获取TV端的音量、当前状态。通过eventReceived方法里的参数GENASubscription的对象getGurrentValues()获取Map对象,判断Map对象的里面的键是否包含“LastChange”字段。如果包含,则获取该键里面的value。5.3.3设备控制代码将通过键(“LastChange”)获取到的值,new的AVTransportLastChangeParser对象,传入new一个LastChange生成一个LastChange对象lastChange。lastChange.getEventedValue获取AVTransportVariable.TransportState对象transportState,transportState.getValue()获取TransportState对象state。if(state==TransportState.PLAYING){Intentintent=newIntent(Intents.ACTION_PLAYING);mContext.sendBroadcast(intent);return;}elseif(state==TransportState.PAUSED_PLAYBACK){Intentintent=newIntent(Intents.ACTION_PAUSED_PLAYBACK);mContext.sendBroadcast(intent);return;}elseif(state==TransportState.STOPPED){Intentintent=newIntent(Intents.ACTION_STOPPED);mContext.sendBroadcast(intent);return;}elseif(state==TransportState.TRANSITIONING){Intentintent=newIntent(Intents.ACTION_TRANSITIONING);mContext.sendBroadcast(intent);return;}(1)播放视频通过ClingUpnpService对象upnpService获取到ControlPoint对象controlPointImpl。publicvoidplay(finalControlCallbackcallback){finalServiceavtService=ClingUtils.findServiceFromSelectedDevice(ClingManager.AV_TRANSPORT_SERVICE);if(Utils.isNull(avtService)){return;}finalControlPointcontrolPointImpl=ClingUtils.getControlPoint();if(Utils.isNull(controlPointImpl)){return;}controlPointImpl.execute(newPlay(avtService){@Overridepublicvoidsuccess(ActionInvocationinvocation){super.success(invocation);if(Utils.isNotNull(callback)){callback.success(newClingResponse(invocation));}}@Overridepublicvoidfailure(ActionInvocationinvocation,UpnpResponseoperation,StringdefaultMsg){if(Utils.isNotNull(callback)){callback.fail(newClingResponse(invocation,operation,defaultMsg));}}});}当播放成功,调用success方法,播放失败调用failure对象。在相应方法里面做了处理。(2)暂停播放publicvoidpause(finalControlCallbackcallback){finalServiceavtService=ClingUtils.findServiceFromSelectedDevice(ClingManager.AV_TRANSPORT_SERVICE);if(Utils.isNull(avtService)){return;}finalControlPointcontrolPointImpl=ClingUtils.getControlPoint();if(Utils.isNull(controlPointImpl)){return;}controlPointImpl.execute(newPause(avtService){@Overridepublicvoidsuccess(ActionInvocationinvocation){super.success(invocation);if(Utils.isNotNull(callback)){callback.success(newClingResponse(invocation));}}@Overridepublicvoidfailure(ActionInvocationinvocation,UpnpResponseoperation,StringdefaultMsg){if(Utils.isNotNull(callback)){callback.fail(newClingResponse(invocation,operation,defaultMsg));}}});}(3)控制播放进度publicvoidseek(intpos,finalControlCallbackcallback){finalServiceavtService=ClingUtils.findServiceFromSelectedDevice(ClingManager.AV_TRANSPORT_SERVICE);if(Utils.isNull(avtService)){return;}finalControlPointcontrolPointImpl=ClingUtils.getControlPoint();if(Utils.isNull(controlPointImpl)){return;}Stringtime=Utils.getStringTime(pos);controlPointImpl.execute(newSeek(avtService,time){@Overridepublicvoidsuccess(ActionInvocationinvocation){super.success(invocation);if(Utils.isNotNull(callback)){callback.success(newClingResponse(invocation));}}@Overridepublicvoidfailure(ActionInvocationinvocation,UpnpResponseoperation,StringdefaultMsg){if(Utils.isNotNull(callback)){callback.fail(newClingResponse(invocation,operation,defaultMsg));}}});}(4)控制音量大小publicvoidsetVolume(intpos,@NullablefinalControlCallbackcallback){finalServicercService=ClingUtils.findServiceFromSelectedDevice(ClingManager.RENDERING_CONTROL_SERVICE);if(Utils.isNull(rcService)){return;}finalControlPointcontrolPointImpl=ClingUtils.getControlPoint();if(Utils.isNull(controlPointImpl)){return;}longcurrentTimeMillis=System.currentTimeMillis();if(currentTimeMillis>mVolumeLastTime+RECEIVE_DELAY){controlPointImpl.execute(newSetVolume(rcService,pos){@Overridepublicvoidsuccess(ActionInvocationinvocation){if(Utils.isNotNull(callback)){callback.success(newClingResponse(invocation));}}@Overridepublicvoidfailure(ActionInvocationinvocation,UpnpResponseoperation,StringdefaultMsg){if(Utils.isNotNull(callback)){callback.fail(newClingResponse(invocation,operation,defaultMsg));}}});}mVolumeLastTime=currentTimeMillis;}(5)音量开关publicvoidsetMute(booleandesired

温馨提示

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

评论

0/150

提交评论