一种在Linux上兼容运行Android系统的文件发送方法及装置与流程

文档序号:26138869发布日期:2021-08-03 14:22阅读:117来源:国知局
一种在Linux上兼容运行Android系统的文件发送方法及装置与流程

本发明涉及计算机操作系统领域,尤其涉及一种在linux上兼容运行android系统的文件发送方法及装置。



背景技术:

由于android应用生态已经成为当今世界上最大的应用生态,因此跨平台运行android应用已经成为一种行业的趋势。众所周知,linux桌面操作系统一直以来最大的问题就是应用生态缺乏的问题,这也导致了linux桌面系统无法成为主流的桌面操作系统的原因,因此把android应用兼容运行在linux桌面系统之上也越来越被大众所接受。

linux操作系统兼容android环境(下文简称linux-android兼容环境)是一种在linux操作系统上运行android应用(app)的技术,对丰富linux操作系统应用生态有着重要的意义。linux-android兼容环境一般由host端和guest端组成,host端运行于linux系统上,主要包括android容器和用户交互窗口,android容器的作用是从linux系统中隔离出部分内核资源来支撑guest端运行,guest端主要包括特殊定制的android应用框架和android运行时库等,android应用都运行在guest端。

用户在linux-android兼容环境中运行使用android应用时,通常都有加载和分享linux系统下文件的需求,例如:用户使用微信或qqapp时需要将某个或者多个linux系统下的文件一次性发送给自己的好友。但是,由于容器的隔离作用,android应用无法直接访问linux系统下的文件,现有技术实现android应用加载host端的文件的方案:

将linux文件通过拖拽的方式,传递文件路径给当前活跃的android应用。通过感知鼠标拖拽行为获取文件的host端路径,模拟鼠标点击android应用中操作按钮的行为完成文件的自动加载。该方案主要存在两个缺点:一是拖拽到的窗口必须是当前活跃的android应用。如果非活跃窗口,功能将失效。二是使用了模拟鼠标点击的方式来完成linux文件的加载,如果应用更新导致页面布局改变,模拟鼠标点击的位置不准确,将会点击到非用户行为的位置,带来一定的风险。例如:之前配置的点击位置是加载文件,应用更新后,此坐标位置改成了视频通话,则用户在使用此功能时,不是加载文件功能,而是使用了视频通话功能。由于不同应用鼠标点击的位置不一样,需要对各个应用进行配置,开发和维护起来较为繁琐。

综上所述,现有的解决方案中,虽然使用了拖拽文件加模拟鼠标的方式做到了加载linux文件,但是此功能需要在android当前活跃的窗口才能生效,且开发和维护起来比较繁琐,应用更新会对用户带来较大的风险。



技术实现要素:

为了解决在linux兼容android环境中,由于容器docker的隔离作用,android应用无法将linux下的文件发送分享,以及不论需要分享发送文件的android应用窗口是当前活跃的应用还是非活跃的应用都能加载和分享linux系统中的文件的问题,本发明提供了一种在linux上兼容运行android系统的文件发送方法及装置。

一方面,本发明提供一种在linux上兼容运行android系统的文件发送方法,所述方法应用在linux上兼容运行android系统的运行环境下,android应用通过android应用显示窗口jd-display-window在linux中显示,所述方法包括如下步骤:

步骤s1:鼠标拖拽linux侧待加载的一个或多个文件至android应用显示窗口jd-display-window并释放;

步骤s2:检测和获取鼠标拖拽事件消息,并将拖拽到达的android应用显示窗口设置为活跃窗口;

步骤s3:检测和获取鼠标释放事件消息;

步骤s4:分析步骤s2、s3获取到的拖拽和释放事件消息,获取拖拽的待加载文件在linux侧的路径与拖拽到达的android应用显示窗口jd-display-window的应用名称;

步骤s5:检测待加载文件的类型是否支持被android应用加载;若待加载的文件支持被android应用加载,则将android内部存储目录挂载到linux系统的目录下,将待加载的linux侧文件复制到android的内部存储目录下;

步骤s6:linux侧用于与android进行通信的组件jd-app-manager将待加载文件所在的android内部存储绝对路径以及待加载文件的android应用的名称,通过socket发送给android侧用于与linux交互的组件jd-app-service;

步骤s7:android侧用于与linux交互的组件jd-app-service接收socket消息,解析消息中待加载文件的android内部存储绝对路径,将socket消息写入到android的系统媒体数据库;

步骤s8:android侧用于与linux交互的组件jd-app-service获取待加载文件在android系统中的统一资源标识符,将所述统一资源标识符发送到android应用的分享接口,所述android应用的分享接口根据统一资源标识符获取文件并发送,其中,所述统一资源标识符唯一标识文件。

进一步地,在步骤s1之前,所述方法还包括:

在linux上启动android应用,android侧用于与linux交互的组件jd-app-service通过socket发送包含所述android应用的名称的启动应用消息给linux侧用于与android侧进行通信的组件jd-app-manager,linux侧用于与android侧进行通信的组件jd-app-manager接收到消息后,启动一个android应用显示窗口jd-display-window程序并显示所述android应用的界面,将所述android应用名称设置到android应用显示窗口jd-display-window的m_package_name变量中,所述jd-display-window程序用于显示android应用的界面。

进一步地,所述步骤s4中获取拖拽到达的android应用显示窗口jd-display-window的应用名称,具体为:

当linux侧android应用显示窗口jd-display-window获取到鼠标拖拽和释放事件时,通过读取所述android应用显示窗口jd-display-window的m_package_name变量获取鼠标拖拽到达的android应用显示窗口jd-display-window的应用名称。

进一步地,所述步骤s5中将android内部存储目录挂载到linux系统的目录下具体为:

在linux上启动android系统时,启动linux侧的文件挂载程序,将android内部存储目录挂载到linux系统的目录下,所述android内部存储目录为容器docker镜像数据目录的子目录/data/media/0。

进一步地,所述步骤s8中所述android应用的分享接口根据统一资源标识符获取文件并发送,具体为:

所述android应用的分享接口查询android系统中发送文件的组件,将待发送文件的统一资源标识符发送给所述发送文件的组件,所述发送文件的组件打开android应用的文件发送界面并将待发送文件的统一资源标识符提供给文件发送界面,所述文件发送界面根据待发送文件的统一资源标识符获取待发送文件,将文件发送给接收方。

另一方面,本发明提供一种在linux上兼容运行android系统的文件发送装置,所述装置应用在linux上兼容运行android系统的运行环境下,android应用通过android应用显示窗口jd-display-window在linux中显示,所述装置包括:

鼠标拖拽和释放事件检测模块,用于当鼠标拖拽linux侧待加载的一个或多个文件至android应用显示窗口jd-display-window,检测和获取鼠标拖拽事件消息,并将拖拽到达的android应用显示窗口设置为活跃窗口;当鼠标释放后,检测和获取鼠标释放事件消息;

获取文件路径和android应用名称模块,用于获取拖拽的待加载文件在linux侧的路径与拖拽到达的android应用显示窗口jd-display-window的应用名称;

挂载复制文件模块,用于检测待加载文件的类型是否支持被android应用加载;若待加载的文件支持被android应用加载,则将android内部存储目录挂载到linux系统的目录下,将待加载的linux侧文件复制到android的内部存储目录下;

文件消息交互模块,用于:linux侧用于与android进行通信的组件jd-app-manager将待加载文件所在的android内部存储绝对路径以及待加载文件的android应用的名称,通过socket发送给android侧用于与linux交互的组件jd-app-service;android侧用于与linux交互的组件jd-app-service接收socket消息,解析消息中待加载文件的android内部存储绝对路径,将socket消息写入到android的系统媒体数据库;

文件发送模块,用于:android侧用于与linux交互的组件获取待加载文件在android系统中的统一资源标识符,将所述统一资源标识符发送到android应用的分享接口,所述android应用的分享接口根据统一资源标识符获取文件并发送,其中,所述统一资源标识符唯一标识文件。

进一步地,所述获取文件路径和android应用名称模块获取拖拽到达的android应用显示窗口jd-display-window的应用名称,具体为:当linux侧android应用显示窗口jd-display-window获取到鼠标拖拽和释放事件时,通过读取所述android应用显示窗口jd-display-window的m_package_name变量获取鼠标拖拽到达的android应用显示窗口jd-display-window的应用名称。

进一步地,所述挂载复制文件模块将android内部存储目录挂载到linux系统的目录下具体为:

在linux上启动android系统时,启动linux侧的文件挂载程序,将android内部存储目录挂载到linux系统的目录下,所述android内部存储目录为容器docker镜像数据目录的子目录/data/media/0。

进一步地,所述文件发送模块根据统一资源标识符获取文件并发送,具体为:

所述android应用的分享接口查询android系统中发送文件的组件,将待发送文件的统一资源标识符发送给所述发送文件的组件,所述发送文件的组件打开android应用的文件发送界面并将待发送文件的统一资源标识符提供给文件发送界面,所述文件发送界面根据待发送文件的统一资源标识符获取待发送文件,将文件发送给接收方。

本发明与现有技术相比,具有以下优点:

1.用户只需要拖拽文件即可发送分享文件,其他的操作都是无感知的;

2.本发明支持多文件拖拽和分享发送;

3.本发明不需要额外配置,且支持任何对外提供分享接口的应用;

4.本发明支持活跃窗口或者非活跃窗口的操作;

5.本发明支持在应用的任一界面调用应用的分享界面。

附图说明

图1是本发明实施例提供的一种在linux上兼容运行android系统的文件发送方法示意图;

图2是本发明实施例提供的一种在linux上兼容运行android系统的文件发送装置组成示意图;

图3是本发明实施例提供的linux兼容运行android从linux侧拖拽文件到飞书发送的示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。

对于在linux操作系统上兼容运行android的运行环境来说,android运行环境是运行在容器中的。

容器是近些年由linux内核支持的一种轻量级虚拟技术。通过容器技术可以在linux系统运行一个新的linux系统(包括其他基于linux系统定制的系统,如android),容器使得客户机系统和主机系统相互隔离。与传统的基于虚拟机技术的方案不同,在容器技术中,客户系统与主机系统共享cpu、内存、存储等资源,资源开销很低。此外,通过适当的配置,还能使客户系统直接访问主机的硬件资源,进一步提升客户系统的性能。

由于容器docker的隔离作用,linux无法访问android的内部存储目录,linux上的android应用无法直接访问linux侧文件。

图1是本发明实施例提供的一种在linux上兼容运行android系统的文件发送方法示意图;所述方法应用在linux上兼容运行android系统的运行环境下,android应用通过android应用显示窗口jd-display-window在linux中显示。在linux上启动android应用,android侧用于与linux交互的组件jd-app-service通过socket发送包含所述android应用的名称的启动应用消息给linux侧用于与android侧进行通信的组件jd-app-manager,linux侧用于与android侧进行通信的组件jd-app-manager接收到消息后,启动一个android应用显示窗口jd-display-window程序并显示所述android应用的界面,将所述android应用名称设置到android应用显示窗口jd-display-window的m_package_name变量中,所述jd-display-window程序用于显示android应用的界面。

所述方法包括如下步骤:

步骤s1:鼠标拖拽linux侧待加载的一个或多个文件至android应用显示窗口jd-display-window并释放;

android应用显示窗口jd-display-window是一个通过qt(qt是一个跨平台的c++应用和ui开发库)实现的窗口程序,主要通过qt的qwindow类和qwidget类实现。无论android应用显示窗口jd-display-window是否是当前活跃的窗口,是否显示在最顶层,都能检测到鼠标拖拽事件。

步骤s2:检测和获取鼠标拖拽事件消息,并将拖拽到达的android应用显示窗口设置为活跃窗口;

对于qwindow类,通过重写event函数来获取拖拽事件,即boolevent(qevent*e);event函数能获取到qwindow的事件消息,包括:按键按下事件,按键松开事件,窗口失去焦点事件,窗口获取焦点事件,鼠标按下事件,鼠标松开事件等等,主要通过e->type()接口来区分。当e->type()等于qevent::dragenter时,即为拖拽事件。

对于qwidget类,通过重写dragenterevent函数来获取拖拽事件,即voiddragenterevent(qdragenterevent*e);dragenterevent函数能获取到qwidget的鼠标拖拽消息。

步骤s3:检测和获取鼠标释放事件消息;

对于qwindow类,当e->type()等于qevent::drop时,即为鼠标拖拽后的释放事件。

对于qwidget类,通过重写dropevent函数来获取拖拽事件,即voiddropevent(qdropevent*event);dropevent函数能获取到qwidget的鼠标拖拽后的释放事件。

步骤s4:分析步骤s2、s3获取到的拖拽和释放事件消息,获取拖拽的待加载文件在linux侧的路径与拖拽到达的android应用显示窗口jd-display-window的应用名称;

通过拖拽和释放事件获取拖待加载文件在linux侧路径的方法如下:

对于qwindow类,event(qevent*e)函数中,通过参数e->mimedata()->text()即能得到待加载文件的路径。对于qwidget类,dropevent(qdropevent*e)函数中,通过参数e->mimedata()->text()即能得到待加载文件的路径。

获取待加载文件在linux侧路径是为了后续将该文件复制到android内部存储,以便android应用加载和分享该文件。

分析拖拽到的android应用显示窗口jd-display-window的应用名的方法如下:

当linux侧某个android应用显示窗口jd-display-window获取到鼠标拖拽和释放事件时,通过读取该android应用显示窗口jd-display-window的m_package_name变量即可获取到拖拽到的android应用显示窗口display-window的应用名。

步骤s5:检测待加载文件的类型是否支持被android应用加载;若待加载的文件支持被android应用加载,则将android内部存储目录挂载到linux系统的目录下,将待加载的linux侧文件复制到android的内部存储目录下;

由于容器docker的隔离作用,linux无法访问android的内部存储目录。在linux下启动android系统时,会启动一个挂载程序即fuse文件系统(用户文件系统),将android内部存储目录(通常是docker镜像数据目录的子目录/data/media/0)挂载到linux系统下的某个目录下,即挂载的目标目录。这样linux程序就能访问android的内部存储目录。将待加载的linux文件复制到挂载的目标目录,android内部存储目录就存在待加载的linux文件。

本发明支持多个文件的加载,不支持文件夹、快捷方式以及没有读取权限的文件(linux系统下需要root权限才能读取的文件)的加载。如果待加载的文件不支持被android应用加载,则提示“文件类型不支持”。

具体检测过程为:通过shell中if[-e/d/h.....]指令读取文件信息。

if[-h\"$path\"]表示path路径下的文件类型为linux软链接;if[-d\"$path\"]表示path路径下的文件类型为文件夹。通过shell中的ls-al指令读取文件的权限信息,if[$(ls-lh\"$path\"|cut-c8)='r']表示path路径下的文件普通用户有读取权限。

文件类型不支持的原因:

1)文件夹:android应用不支持文件夹的加载和分享。

2)快捷方式(linux软链接):

linux软链接,类似于windows系统的快捷方式。当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在其它的目录下用ln命令链接(link)就可以,不必重复的占用磁盘空间。linux软链接必须和被指向的原文件同时存在,不能单独存在,但若被指向的原文件被删除,则相关软链接被称为死链接(即danglinglink),软链接也会失效。如果用户将linux系统中的快捷方式拖拽到android应用显示窗口jd-display-window,通过android应用加载和分享给其他用户,其他用户仅仅接收到快捷方式,没有接收到被指向的原文件,快捷方式会失效。所以不支持这类文件的加载和分享。

3)没有读取权限的文件(linux系统下需要root权限才能读取的文件):

linux系统下部分文件是系统文件,需要root权限才能读取。如果将这部分文件拖拽到android应用显示窗口jd-display-window,android应用没有读取这些文件的权限,所以不支持这类文件的加载和分享。

步骤s6:linux侧用于与android进行通信的组件jd-app-manager将待加载文件所在的android内部存储绝对路径以及待加载文件的android应用的名称,通过socket发送给android侧用于与linux交互的组件jd-app-service;

步骤s7:android侧用于与linux交互的组件jd-app-service接收socket消息,解析消息中待加载文件的android内部存储绝对路径,将socket消息写入到android的系统媒体数据库;

安卓系统通过系统媒体进程(安卓系统自带的一个进程)统一管理设备上所有的多媒体文件,系统中的每一个文件都在系统媒体数据库中有唯一的标识符,通过这个唯一标识符就可以获取到这个文件。

步骤s8:android侧用于与linux交互的组件jd-app-service获取待加载文件在android系统中的统一资源标识符,将所述统一资源标识符发送到android应用的分享接口,所述android应用的分享接口根据统一资源标识符获取文件并发送,其中,所述统一资源标识符唯一标识文件。

进一步地,所述步骤s4中获取拖拽到达的android应用显示窗口jd-display-window的应用名称,具体为:

当linux侧android应用显示窗口jd-display-window获取到鼠标拖拽和释放事件时,通过读取所述android应用显示窗口jd-display-window的m_package_name变量获取鼠标拖拽到达的android应用显示窗口jd-display-window的应用名称。

进一步地,所述步骤s5中将android内部存储目录挂载到linux系统的目录下具体为:

在linux上启动android系统时,启动linux侧的文件挂载程序,将android内部存储目录挂载到linux系统的目录下,所述android内部存储目录为容器docker镜像数据目录的子目录/data/media/0。

进一步地,所述步骤s8中所述android应用的分享接口根据统一资源标识符获取文件并发送,具体为:

所述android应用的分享接口查询android系统中发送文件的组件,将待发送文件的统一资源标识符发送给所述发送文件的组件,所述发送文件的组件打开android应用的文件发送界面并将待发送文件的统一资源标识符提供给文件发送界面,比如微信的文件分享的好友选择列表界面或者是邮箱的上传附件界面,所述文件发送界面根据待发送文件的统一资源标识符获取待发送文件,将文件发送给接收方,比如在好友选择列表界面点击某个好友,就可以将此文件发送给这个好友,或者是邮箱应用可以上传这个附件到邮件编辑界面。

图2是本发明实施例提供的一种在linux上兼容运行android系统的文件发送装置组成示意图;所述装置应用在linux上兼容运行android系统的运行环境下,android应用通过android应用显示窗口jd-display-window在linux中显示,所述装置包括:

鼠标拖拽和释放事件检测模块,用于当鼠标拖拽linux侧待加载的一个或多个文件至android应用显示窗口jd-display-window,检测和获取鼠标拖拽事件消息,并将拖拽到达的android应用显示窗口设置为活跃窗口;当鼠标释放后,检测和获取鼠标释放事件消息;

获取文件路径和android应用名称模块,用于获取拖拽的待加载文件在linux侧的路径与拖拽到达的android应用显示窗口jd-display-window的应用名称;

挂载复制文件模块,用于检测待加载文件的类型是否支持被android应用加载;若待加载的文件支持被android应用加载,则将android内部存储目录挂载到linux系统的目录下,将待加载的linux侧文件复制到android的内部存储目录下;

文件消息交互模块,用于:linux侧用于与android进行通信的组件jd-app-manager将待加载文件所在的android内部存储绝对路径以及待加载文件的android应用的名称,通过socket发送给android侧用于与linux交互的组件jd-app-service;android侧用于与linux交互的组件jd-app-service接收socket消息,解析消息中待加载文件的android内部存储绝对路径,将socket消息写入到android的系统媒体数据库;

文件发送模块,用于:android侧用于与linux交互的组件jd-app-service获取待加载文件在android系统中的统一资源标识符,将所述统一资源标识符发送到android应用的分享接口,所述android应用的分享接口根据统一资源标识符获取文件并发送,其中,所述统一资源标识符唯一标识文件。

进一步地,所述获取文件路径和android应用名称模块获取拖拽到达的android应用显示窗口jd-display-window的应用名称,具体为:当linux侧android应用显示窗口jd-display-window获取到鼠标拖拽和释放事件时,通过读取所述android应用显示窗口jd-display-window的m_package_name变量获取鼠标拖拽到达的android应用显示窗口jd-display-window的应用名称。

进一步地,所述挂载复制文件模块将android内部存储目录挂载到linux系统的目录下具体为:

在linux上启动android系统时,启动linux侧的文件挂载程序,将android内部存储目录挂载到linux系统的目录下,所述android内部存储目录为容器docker镜像数据目录的子目录/data/media/0。

进一步地,所述文件发送模块根据统一资源标识符获取文件并发送,具体为:

所述android应用的分享接口查询android系统中发送文件的组件,将待发送文件的统一资源标识符发送给所述发送文件的组件,所述发送文件的组件打开android应用的文件发送界面并将待发送文件的统一资源标识符提供给文件发送界面,所述文件发送界面根据待发送文件的统一资源标识符获取待发送文件,将文件发送给接收方。

图3是本发明实施例提供的linux兼容运行android从linux侧拖拽文件到飞书发送的示意图。示意图界面为linux系统上兼容运行android的环境下,在linux桌面上用户在使用android应用qq和飞书,拖拽文件前,飞书处于非活跃状态,qq处于活跃状态(用户正在qq上与好友聊天),用户将linux侧的两个文件同时拖拽到飞书界面以便分享给好友。该界面说明本发明可以直接将linux侧文件拖拽到非活跃窗口发送,不需要先激活非活跃窗口(比如通过点击非活跃窗口以激活应用)再拖拽文件才能发送分享文件。

最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

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