Qt Android 目录
Qt Android Directories
我担心两个关于 Qt 如何处理 Android 目录的问题。
- 例如,我想通过一个库(QuaZip)下载一个存档,但我需要它沿着路径“/storage/emulated/0/Android/data/”下载,并且然后在那里解压缩。但问题是文件保存在补丁“/data/user/0/org.qtproject.example.NameApp”中。这怎么能解决?我的代码(它不太可能完全起作用,但在 Windows 上肯定会起作用):
m_file.rename ("/storage/emulated/0/Android/data/cache.zip");
- 我可以通过 QProccess 在 Android 中打开文件吗?
关于 Android/data
r/w
的第一个问题
On Android 11 Android/data
禁止非 root 应用程序访问,参见 docs1 and docs2。
对于 read/write 到其他位置:
- 目录必须存在或必须创建(
QDir::mkpath()
at once, or with QDir::mkdir()
子目录顺序,因为它不能创建目录树)。
QFile
重命名前必须关闭。
- 应用程序必须具有
android.permission.READ_EXTERNAL_STORAGE
和 android.permission.WRITE_EXTERNAL_STORAGE
权限。
- 最后,在从 Qt Creator 部署应用程序后,在 Android 应用程序设置中手动批准文件访问权限。而且您可能还必须手动启动应用程序,因为从 IDE 启动和从设备手动启动时,存在 reports 不同的应用程序行为。
这段代码对我有用(Android 11,Qt 5.15.2):
bool result;
QDir dir("/storage/emulated/0");
qDebug() << dir;
result = dir.mkdir("cache");
qDebug() << "mkdir(\"cache\") success: " << result;
QFile m_file(dir.path() + "/cache/cache.txt");
result = m_file.open(QFile::WriteOnly);
qDebug() << "open() success: " << result;
m_file.close();
result = m_file.rename(dir.path() + "/cache/cache.zip");
qDebug() << "rename() success: " << result;
关于你的第二个问题QProcess
这段代码对我有用:
QProcess process;
process.start("touch", QStringList() << "/storage/emulated/0/new_text_file.txt");
result = process.waitForFinished(1000);
qDebug() << "waitForFinished() success: " << result;
qDebug() << "errorString(): " << process.errorString();
文件 new_text_file.txt
出现在我的设备存储中。如果您指定要启动的文件类型,我可以回答更准确。
我担心两个关于 Qt 如何处理 Android 目录的问题。
- 例如,我想通过一个库(QuaZip)下载一个存档,但我需要它沿着路径“/storage/emulated/0/Android/data/”下载,并且然后在那里解压缩。但问题是文件保存在补丁“/data/user/0/org.qtproject.example.NameApp”中。这怎么能解决?我的代码(它不太可能完全起作用,但在 Windows 上肯定会起作用):
m_file.rename ("/storage/emulated/0/Android/data/cache.zip");
- 我可以通过 QProccess 在 Android 中打开文件吗?
关于 Android/data
r/w
的第一个问题
On Android 11 Android/data
禁止非 root 应用程序访问,参见 docs1 and docs2。
对于 read/write 到其他位置:
- 目录必须存在或必须创建(
QDir::mkpath()
at once, or withQDir::mkdir()
子目录顺序,因为它不能创建目录树)。 QFile
重命名前必须关闭。- 应用程序必须具有
android.permission.READ_EXTERNAL_STORAGE
和android.permission.WRITE_EXTERNAL_STORAGE
权限。 - 最后,在从 Qt Creator 部署应用程序后,在 Android 应用程序设置中手动批准文件访问权限。而且您可能还必须手动启动应用程序,因为从 IDE 启动和从设备手动启动时,存在 reports 不同的应用程序行为。
这段代码对我有用(Android 11,Qt 5.15.2):
bool result;
QDir dir("/storage/emulated/0");
qDebug() << dir;
result = dir.mkdir("cache");
qDebug() << "mkdir(\"cache\") success: " << result;
QFile m_file(dir.path() + "/cache/cache.txt");
result = m_file.open(QFile::WriteOnly);
qDebug() << "open() success: " << result;
m_file.close();
result = m_file.rename(dir.path() + "/cache/cache.zip");
qDebug() << "rename() success: " << result;
关于你的第二个问题QProcess
这段代码对我有用:
QProcess process;
process.start("touch", QStringList() << "/storage/emulated/0/new_text_file.txt");
result = process.waitForFinished(1000);
qDebug() << "waitForFinished() success: " << result;
qDebug() << "errorString(): " << process.errorString();
文件 new_text_file.txt
出现在我的设备存储中。如果您指定要启动的文件类型,我可以回答更准确。