一种安卓系统陀螺仪事件的转换方法及装置与流程

文档序号:16465111发布日期:2019-01-02 22:45阅读:778来源:国知局
一种安卓系统陀螺仪事件的转换方法及装置与流程

本发明涉及移动设备的外设控制,尤其涉及一种安卓系统陀螺仪事件的转换方法、电子设备及存储介质。



背景技术:

目前,市面上绝大部分射击类手游/其它支持陀螺仪操控的等应用,在控制游戏视角/陀螺仪操控的时候只能够通过手机屏幕来触控游戏或者通过晃动手机去调整陀螺仪控制,在操控方面有着诸多不如意的地方,手感操作体验性不好。

为了实现通过手柄、键盘鼠标等外设对手游的操作控制,现有技术中一般采用手机系统root来获取超级管理员权限实现指定指令的调用,但是此方法存在泄漏消费者隐私、破坏系统稳定性等安全隐患,同时也会失去官方的保修权利;同时手机系统root的操作方法也极为复杂,需要专业的技术人员来操作,很难较为普通用户接受。



技术实现要素:

为了克服现有技术的不足,本发明的目的之一在于提供一种安卓系统陀螺仪事件的转换方法,其能够解决现有技术中通过外设支持手机应用的陀螺仪操作、或者通过外设操作手机应用时其陀螺仪功能时需要获取设备的超级权限、操作复杂等问题。

本发明的目的之二在于提供一种电子设备,其能够解决现有技术中通过外设支持手机应用的陀螺仪操作、或者通过外设操作手机应用时其陀螺仪功能时需要获取设备的超级权限、操作复杂等问题。

本发明的目的之三在于提供一种计算机可读存储介质,其能够解决现有技术中通过外设支持手机应用的陀螺仪操作、或者通过外设操作手机应用时其陀螺仪功能时需要获取设备的超级权限、操作复杂等问题。

本发明的目的之一采用如下技术方案实现:

一种安卓系统陀螺仪事件的转换方法,包括以下步骤:

虚拟空间创建步骤:创建虚拟空间并在该虚拟空间内安装至少一个应用;

原始数据获取步骤:与外设连接并接收外设的原始数据;

陀螺仪对象获取步骤:获取该虚拟空间内的正在运行的应用,并根据正在运行的应用获取陀螺仪对象;

转换步骤:根据外设的原始数据与陀螺仪对象生成陀螺仪事件;

发送步骤:将陀螺仪事件发送给该正在运行的应用,进而实现对该正在运行的应用的陀螺仪事件的操作控制。

进一步地,与外设的连接方式为有线连接或无线连接。

进一步地,所述陀螺仪对象获取步骤还包括:根据正在运行的应用获取对应的数据接口,并根据该数据接口获取对应的陀螺仪对象。

本发明的目的之二采用如下技术方案实现:

一种电子设备,包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤:

虚拟空间创建步骤:创建虚拟空间并在该虚拟空间内安装至少一个应用;

原始数据获取步骤:与外设连接并接收外设的原始数据;

陀螺仪对象获取步骤:获取该虚拟空间内的正在运行的应用,并根据正在运行的应用获取陀螺仪对象;

转换步骤:根据外设的原始数据与陀螺仪对象生成陀螺仪事件;

发送步骤:将陀螺仪事件发送给该正在运行的应用,进而实现对该正在运行的应用的陀螺仪事件的操作控制。

进一步地,与外设的连接方式为有线连接或无线连接。

进一步地,所述陀螺仪对象获取步骤还包括:根据正在运行的应用获取对应的数据接口,并根据该数据接口获取对应的陀螺仪对象。

本发明的目的之三采用如下技术方案实现:

一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如本发明目的之一所述的一种安卓系统陀螺仪事件的转换方法的步骤。

相比现有技术,本发明的有益效果在于:

本发明通过在安卓系统中创建虚拟空间并在该虚拟空间下安装相应的应用,然后再获取的外设数据以及通过应用的数据接口获取的陀螺仪对象,将外设的数据写入到陀螺仪对象中,进而生成陀螺仪事件,最终将陀螺仪事件发送给应用,完成该应用的陀螺仪操作配置,完成通过外设对应用的陀螺仪操作来替代通过触摸屏幕对应用的操作,解决现有技术中通过触摸屏幕对应用的陀螺仪操作其手感操作体验不好的问题;同时其也解决现有技术中通过系统root来实现外设对应用的陀螺仪操作配置时需要具备专业技能的人来实现,其不适用于普通用户的缺陷。

附图说明

图1为本发明提供的一种安卓系统陀螺仪事件的转换方法的工作原理框图;

图2为本发明提供的一种安卓系统陀螺仪事件的转换方法的流程图;

图3为本发明提供的沙盒工作原理图之一;

图4为本发明提供的沙盒工作原理图之二。

具体实施方式

下面,结合附图以及具体实施方式,对本发明做进一步描述,需要说明的是,在不相冲突的前提下,以下描述的各实施例之间或各技术特征之间可以任意组合形成新的实施例。

基于安卓系统的特性,在安卓系统中如果其中一个应用需要向其他应用或系统发送指令时,一般来说,在系统默认权限下会受到系统安全性约束,是无法实现的。另外,安卓系统中还存在应用隔离机制,该应用隔离机制是基于linux系统的多用户机制来实现的,即每个应用在安装时均被分配了不同的linux用户uid。也即是说,由于应用的uid不同,导致其应用之间不能够发送数据指令。

为了解决上述缺陷,同时不需要像现有技术那样需要专业的技术人员进行系统root操作,本发明通过在系统中创建一个虚拟空间,在该虚拟空间内可以任意安装、启动和卸载应用,这一切均与外界隔离,如同一个沙盒。在该沙盒内,通过沙盒安装的应用与沙盒本身具备相同的uid,这样就可以通过沙盒将指令发送给相同的uid的其他应用。

本发明就是利用上述机制来实现,通过沙盒接收外设的原始数据,由于应用是安装在沙盒内的,因此沙盒可以读取应用的相应数据,并将外设的原始数据写入到相应的位置,实现通过外设对手机应用的陀螺仪操作配置,实现通过外设对手机应用的操作控制。另外,本发明中所指的手机应用是针对支持陀螺仪操作的应用,比如支持陀螺仪操作的手游。本文中只是以手游作为一事例来说明其具体的实现方法。

如图1所示,在移动设备上创建虚拟空间,也即是沙盒,通过移动设备与外设连接,使得沙盒接收到相应的外设的原始数据,然后启动沙盒中相应的app,并根据该app来获取到相应的陀螺仪对象,然后将该外设的原始数据写入到陀螺仪对象中,将其转换成陀螺仪事件,这样当应用需要对陀螺仪事件进行控制操作时,就可以读取该陀螺仪事件中的陀螺仪数据,即完成对游戏的陀螺仪事件的操作配置。

如图2所示,该转换方法具体包括以下步骤:

步骤s0:创建虚拟空间并在该虚拟空间内安装相应的应用(也称app)。通过在安卓系统中创建虚拟空间,并将需要的app安装到该虚拟空间内,比如将极品飞车、qq飞车、枪战游戏、射击类游戏等以及其他支持陀螺仪操作的应用安装在该虚拟空间中。本发明一般采用游戏应用来说明,具体如何操作。

安装在该沙盒内的app的uid与沙盒的uid是相同的,沙盒与该app之间能够互相发送相应的指令。

本发明中的沙盒技术可以采用virtualapp和droidplugin。以下以virtualapp(简称va)举例来说明沙盒的工作原理:

va是一个开源的android应用容器框架,允许用户在系统中创建虚拟空间,并且安装第三方应用(app)到该虚拟空间中。为了保证应用可以无感知的运行在容器中,va参照framework源码实现,构造了一个能够运行app的环境。

系统原生的framework运作方式,我们平时所用到的app运行空间中的frameworkapi最终会通过binder远程调用到frameworkservice空间的远程服务。而远程服务类似ams中会持有app空间的ibindertoken句柄,通过token也可以让frameworkservice远程调用到app空间,如图1所示。

而在va环境下,情况其实也是类似,只不过在frameworkservice和clientapp之间还有另外一个va实现的vaservice;该vaservice仿造了frameworkservice的一些功能,完成系统服务的代理和替换。

因为在va中运行的clientapp都是没有(也不能注册)在frameworkservice的,注册的只有va预先注册在androidmanifest中的stub而已。所以frameservice是无法像普通app一样管理vaclientapp的会话的。这就要依靠va仿造的另外一套vaservice完成对va中clientapp的会话管理,如图2所示。

从启动virtualapp到运行其中的应用,大致流程如下:

(1)启动host应用:

启动virtualapp,其application为io.virtualapp.vapp。在attachbasecontext()方法中会调用到com.lody.virtual.client.core.patchmanager#injectinternal,但此时为mainprocess,不进行系统服务的替换。

(2)启动serverprocess:

host应用会进行一些初始化,其中就包括获取全部已安装应用,这会调用到com.lody.virtual.client.core.virtualcore#getallapps。而这一方法最终会访问com.lody.virtual.server.binderprovider。由androidmanifest.xml可知,该provider会运行在新进程io.virtualapp:x中,即serverprocess。

由于在新进程中启动组件,同样会首先创建该应用的application,因此也会调用到com.lody.virtual.client.core.patchmanager#injectinternal。此时,会进行相应系统服务(activitymanager和packagemanager)的代理构造和替换。

(3)启动vappprocess:

点击一个已安装应用,此时会通过替换掉的系统服务访问真实的系统服务:并在新进程中启动组件com.lody.virtual.client.stub.stubactivity.c0。由androidmanifest.xml可知,该进程具有后缀:p0。

同样的,在该activity组件启动之前会初始化io.virtualapp.vapp,并在com.lody.virtual.client.core.patchmanager#injectinternal中完成系统服务的代理构造和替换。

(4)启动client应用:

此时,真正的client应用尚未启动,进程io.virtualapp:p0仅仅是作为一个placeholder。stubactivity会从intent中获取到client应用的相关信息,并修改自身activitythread的handler。随后调用startactivity启动client应用。

由于之前serverprocess和vappprocess都已完成了相关系统服务的替换,这里会完成client应用的bindapplication调用、构造client应用的loadedapk,并通过反射完成真正的application和activity的创建。

最终,client应用运行在了我们的vappprocess中。

进一步地,还包括步骤s1:与外设连接并接收外设的原始数据。该原始数据也即为陀螺仪数据,比如坐标系下的x,y,z的坐标值等。

步骤s0和步骤s1在实际的执行过程中并没有先后顺序,也可以先通过与外设建立连接接收外设的原始数据后,再创建虚拟空间。

而且,由于沙盒是安装在移动设备上的,当外设与移动设备连接时,沙盒能够接收到外设的原始数据。

由于该转换方法是应用到移动设备中,比如手机、平板等,因此在接收外设的数据时,其与外设的连接方式可以是无线的,也可以是有线的;可以死标准输入,也可以是非标准输入。不同的连接方式,其获取数据的方式不同。

常见的连接方式比如:wifi、2.4g、蓝牙连接、有线连接以及其他无线连接等,比如对于标准输入,一般操作系统均具备标准的接口读取数据;而非标准数据为定义的数据,可通过通信标准来实现数据的获取。

比如,有线连接的方式主要是由hid、otg等,其中hid和otg都是通用的系统标准键值数据解析。其中hid,全称:人机接口设备(humaninterfacedevice)是windows最早支持的usb类别的接口,比如可以连接陀螺仪设备。otg(on-the-on),主要是各种不同设备或移动设备间的连接,进行数据交换。

其数据获取过程如下:一般来说,当外部设备可用时,由于linux内核会在/dev/input/下创建对应的名为event0~n或其他名称的设备节点。而当外部设备部可用时,则会将对应的节点删除。当用户操作输入设备时,linux内核接收到相应的硬件终端,然后将终端加工成原始的输入时间数据并写入其对应的设备节点中,其可以通过read()函数将事件数据读出。

因此,本发明中当外设的连接方式为hid和otg时,通过安卓系统来监控/dev/input/下所有的设备节点,判断是否存在需要的外设设备节点。该外设设备节点类似于文件,只要有数据写入该文件内,直接将数据从该文件中读出,也即是本发明所需要的外设的数据。

无线方式比如ble,全称:低功耗蓝牙连接(bluetoothlowenergy),其数据的获取过程如下:

由于ble分为三部分service、characteristic、descriptor,这三部分都由uuid作为唯一标示符。一个蓝牙4.0的终端可以包含多个service,一个service可以包含多个characteristic,一个characteristic包含一个value和多个descriptor,一个descriptor包含一个value。一般来说,characteristic是手机与ble终端交换数据的关键。android手机与ble终端设备通信结果都是以回调的形式返回。当我们开始连接蓝牙终端设备的时候,连接方法就自动就帮我们返回了一个bluetoothgatt对象了,它相当于一个管道,是我们建立通信的前提。我们在得到一个相应的特征以后,接下来就可以开始读写操作进行通信了。也即是说,当外设与该移动设备的连接方式为蓝牙连接时,直接获取对应的外设的原始数据即可。

步骤s2:获取该虚拟空间内的正在运行的应用,并根据该正在运行的应用获取对应的陀螺仪对象。

当需要对应用进行陀螺仪事件的控制时,首先将安装在虚拟空间内的应用启动,然后在获取陀螺仪对象时,根据该应用获取对应的数据接口,然后根据该数据接口调用对应的陀螺仪对象。由于该应用时安装在虚拟空间(沙盒)内,因此该应用与沙盒的uid是相同的,因此该沙盒能够根据该应用来获取其陀螺仪对象。

步骤s3:根据外设的原始数据与陀螺仪对象生成陀螺仪事件。其中陀螺仪事件一般是由左右、上下、前后三个方向对应的x,y,z和一个传感器类型的标识数据组合而成。

在将陀螺仪对象转换为陀螺仪事件时,实际上是将接收的外设的原始数据写入到陀螺仪对象中,得出相应的陀螺仪事件。该陀螺仪事件内包括陀螺仪数据,也即是外设的原始数据。游戏操作陀螺仪事件时实际上就是获取该陀螺仪数据来得到的。比如,原始数据的x,y数据,通过比例计算转换成陀螺仪的x,y数据,然后将该转换后的陀螺仪的x,y数据复制到陀螺仪事件对象中,生成陀螺仪事件。

步骤s4:将陀螺仪事件发送给应用,实现该应用的陀螺仪事件的操作配置。由于该应用的uid与沙盒本身的uid相同,该应用可以直接读取陀螺仪事件中的陀螺仪数据,而不会受到安卓系统的约束。另外,在实际的使用过程中,由于游戏本身也会自动监听并获取陀螺仪数据,而本发明是主动向游戏发送陀螺仪数据的,因此为了避免冲突,本发明会在沙盒中屏蔽原本游戏所监听陀螺仪的数据,使得游戏只接收沙盒发送给游戏的陀螺仪数据。

其陀螺仪事件转换以及发送过程在实际使用时,可通过如下代码来实现:

a1:通过getcontext()获取到上下文对象mcontext;

a2:mcontext.getsystemservice获取到sensormanager对象;

a3:通过sensormanager获取到或者实例一个陀螺仪的sensor对象,类型为4;

a4:实例一个sensorevent,将解析数据获取到的x、y的值赋值到sensorevent里面;

a5:通过调用sensormanager里面的msensorlisteners的sensoreventqueue对象的dispatchsensorevent方法,将数据发送。

比如对于枪战游戏类型,对于游戏视角来说,通过视角去观察眼前的景色和动静,同时在开枪瞄准的时候,有个准星一样的东西在屏幕中心,通过改变视角去达到瞄准的目的,而如今大部分游戏都支持通过陀螺仪去控制视角,旨在追求仿真效果。因此,本发明通过利用沙盒的机制,创建一虚拟空间,可以在该虚拟空间内任意安装、卸载或启动应用,使得应用与沙盒本身具备相同的uid,这样沙盒就能够将获取的外设的数据写入到该游戏应用的陀螺仪对象中,进而使得游戏应用来调用该陀螺仪对象的陀螺仪数据,也即是利用游戏本身的逻辑去处理游戏操作,这样使得游戏体验接近原生支持,同时不需要操作安卓系统的root行为,确保了手机安全性和减少用户操作的繁琐。

另外,对于现有技术中,比如通过外界手柄或者利用手机自带的陀螺仪来控制游戏的操作时,由于人手每次旋转设备的范围3°以上,难以达到精准的操作;另外,人手旋转设备横向或纵向的范围均在-45°~45°之间,难以达到360°的全范围。但是通过本发明可以提高控制的精度,比如在配置信息中设定灵敏度的配置,然后通过接收外设输入的数据进行配置,来提高陀螺仪的更加精准的操作控制;设定的控制范围,使得控制的范围更广,比如可快速模拟陀螺仪旋转360°的数据;另外,由于使用外设,其体验性能相比旋转设备(比如手机、平板等)本身的操作方式要好的多;另外,使用外设控制陀螺仪,无需长时间握持设备,操作更简单更轻松,大大提升使用陀螺仪的体验。

本发明还提供了一种电子设备,其包括存储器、处理器以及存储在存储器上并可在处理上运行的计算机程序,所述处理器执行所述程序时实现如文中所述的一种安卓系统陀螺仪事件的转换方法的步骤。

本发明还提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现如文中所述的一种安卓系统陀螺仪事件的转换方法的步骤。

上述实施方式仅为本发明的优选实施方式,不能以此来限定本发明保护的范围,本领域的技术人员在本发明的基础上所做的任何非实质性的变化及替换均属于本发明所要求保护的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1