Qt for Android开发中的存储问题

苏彦君
2023-12-01

前言

笔者简单记录下,最近项目中遇到几个问题,供android开发的小伙伴参考下

一、android中常用的存储位置

首先做点准备,明确一个概念,Android对内部存储和外部存储不是在物理上区分的,而是在逻辑上区分的。android会常用的存储位置如下

1.内部私有存储位置

/data/data/packname/

/data/user/0/

这两个目录的区别是后者区分用户,一般使用前者就可以了

这个目录会随着用户删除app而删除,app访问自己的目录,不需要做权限处理,但不能访问其他的app目录

若用户要直接查看对应的目录或文件,一般需要root权限

2.外部私有存储位置

/storage/emulate/0/Android/data/packagename/

/mnt/sdcard/Android/data/packagename/

/storage/sdcard0/Android/data/packagename/

和内部私有存储类似,这个目录会随着用户删除app而删除,app访问自己的目录,不需要做权限处理,但不能访问其他的app目录

若用户可以直接查看对应的目录或文件

3.外部共享存储位置

/storage/emulated/0/

/mnt/sdcard/

/storage/sdcard0/

这个目录的位置,就是我们在文件浏览器中常见的存储空间(不同设备不同)

程序要访问这个目录,一般需要动态获取存储权限,因时间问题,笔者未测试最新版本的存储权限

注:

(1)实际开发时,可能情况比较复杂,建议小伙伴自己查看下开发机的具体目录;一般情况下,只有一个是实际目录,其他都是链接过去的

(2)若使用文件对话框获取的目录,都是url地址,并不是实际的文件目录,但对应一个真实的文件目录

(3)在较低版本的android中(Android6.0以前),可以在AndroidManifest.xml添加存储权限,就可以正常操作,但之前的版本,需要动态获取对应权限,有时还需要手动到设置中添加对应的存储权限

二、android中添加比较大的资源文件

有时,一些文件并不想让用户看到或添加,一个比较简单的方法就是添加到Qt的资源文件中。默认情况下,资源文件稍微大一点,编译时就很吃内存,导致编译失败

有两种解决方案可以尝试下:
1、在.pro文件中添加CONFIG += resources_big

2、再新建一个qrc文件,把部分资源添加到新的qrc中,把新的qrc加入到工程里再编译。

后记

笔者使用的是Qt Creator7.0.2,当前的AndroidManifest.xml编辑器比之前改善不少,但仍然存在问题,如切换其他android套件时,可能包名就没生效。笔者尝试重新编译,也没成功,但可以通过重新生成AndroidManifest.xml来修改包名

想吐槽一点的是,这次为部队项目提供的标准机,配置好低(2G内存+6G存储),希望供货商多考虑下国家利益,这是多少年前的配置了。

2022.10.21

昨天有小伙伴反馈,外部私有目录,无法使用QDir创建,笔者测试了下,确实无法创建。笔者之前 测试一直有多媒体模块,而多媒体模块可以正常创建。临时解决方法是,手工到对应目录上创建私有根目录,然后就可以正常使用了

 类似资料: