QSettings在Qt下的Android系统中不能正常工作。

7

我希望在我的运行于安卓上的Qt应用程序中保存一些用户凭证。我使用QSettings来实现这个功能,代码如下:

QString appPath = QCoreApplication::applicationDirPath()+QLatin1Char('/');
set = new QSettings(appPath+"test",
                   QSettings::NativeFormat);
set->setValue ( "user/username", "NameOfTheUser" );
set->setValue ( "user/password", "UserPassword" );
set->sync();

我重新启动应用程序,在initialize()方法中,我有以下内容:

QString username(set->value("user/username",
                                           ( QVariant ) tr ( "defaultUser" ) ).toString());
QString password(set->value("user/password",
                                           ( QVariant ) tr ( "defaultPass" ) ).toString());

用户名和密码变量未从QSettings中读取。
相同的代码在Windows上运行良好。
谢谢


这个路径在大多数平台上都不可写,包括Android。你尝试使用默认构造(无参数)的QSettings对象了吗? - Frank Osterfeld
我按照你说的尝试了,使用QSettings("test"),但是仍然出现相同的响应,即用户名和密码无效。也许值得一提的是,我的AndroidManifest.xml设置包含"...user-permission ...WRITE_EXTERNAL_STORAGE"。这是我唯一的提示,但是它已经设置了,但仍然无法正常工作。谢谢。 - Lucian
1
我认为,部署包括一个设置文件并使用该文件会有所帮助。或者使用QSettings :: IniFormat,并将文件放置在/ sdcard / .settings或/ mnt / card0上。使用一些预定义的路径。 - Md. Minhazul Haque
1
QSettings(test) 也会从工作目录构建路径。尝试默认构造一个,即new QSettings() - Frank Osterfeld
我尝试使用QSettings()但没有成功。将其保存在“/sdcard…”上可以工作。这很奇怪,因为我没有SD卡,我有一个Nexus手机。谢谢你的回答。 - Lucian
6个回答

6

我也遇到了类似的问题,并发现需要做两件事情:

  1. 必须指定设置文件的路径。
  2. 在每次更改设置后,应明确调用QSettings::sync()。

所以在Windows上,我是这样解决的:

QSettings settings("settings.ini", QSettings::IniFormat);
settings.setValue(GRID_ENABLED, enabled);

在 Android 上,我必须使用以下代码:
QSettings settings("/sdcard/settings.ini", QSettings::NativeFormat); //can be IniFormat, no difference
settings.setValue(GRID_ENABLED, enabled);
settings.sync();

可能使用"sdcard"不够好,你应该使用其他目录。


2
您可以尝试将设置文件的位置指定为可写位置,即使应用程序被删除,该位置仍然存在:
#include <QSettings>
#include <QStandardPaths>

QString path ;
QString filename;

path = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) ;
filename = “config.ini” ;
QSettings settings(path + “/”+ filename,QSettings::IniFormat) ;

这里QStandardPaths::GenericDataLocation返回一个目录位置,可以用来存储跨应用程序共享的持久化数据,并且它永远不为空。

此外,您可以在应用程序的主函数中设置应用程序和组织名称:

qApp->setOrganizationName("Company");
qApp->setApplicationName("App");

1

你好,我已经找到了解决方案,并在三个不同的Android设备上进行了测试。您可以为您的设置设置以下路径。

mPath = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation);
QString filename = "se.ini";
mPath = mPath + "/" + filename;

通过以下代码,您可以将信息保存在上述位置。
void ProfileManager::saveToRegistery()
{
    QSettings settings(mPath , QSettings::NativeFormat);
    settings.setValue("SE/Mail" , mMail);
    settings.setValue("SE/Pass" , mPass);

    settings.sync();
}

如果您在保存该位置时遇到任何问题,您需要请求用户权限以访问任何文件:
bool QAndroidPermissions::requestPermissions()
{

    QtAndroid::PermissionResult r = 
    QtAndroid::checkPermission("android.permission.WRITE_EXTERNAL_STORAGE");
    if(r == QtAndroid::PermissionResult::Denied) {
    QtAndroid::requestPermissionsSync( QStringList() << 
     "android.permission.WRITE_EXTERNAL_STORAGE" );
    r =QtAndroid::checkPermission("android.permission.WRITE_EXTERNAL_STORAGE");
    if(r == QtAndroid::PermissionResult::Denied) {
        return false;
    }
}
return true;

}

希望这有所帮助。

1

如前所述,从Qt Creator重新部署应用程序会清除设置。

在Qt Creator 3.3.2中仍然如此,但有以下警告。当您在Android上部署应用程序并查看应用程序输出窗口时,会出现一个工具栏,其中包含“停止”按钮(红色正方形)和“重新运行此运行配置”按钮(绿色三角形)。

从Qt开始的初始部署启动了应用程序。QSettings对象被清除或为空。对QSettings对象的任何更改都将保存在对象中。

如果您使用红色按钮停止应用程序,然后立即使用绿色“重新运行”按钮重新启动应用程序,则应用程序将重新启动,并且上一次运行中对QSettings对象所做的所有更改仍将存在。

我认为这模拟了在设备上启动、退出、重新启动应用程序的过程。


0

我曾经遇到过类似的问题,但最终发现一切都正常。只需使用一个简单的QSettings对象而不需要任何参数即可正常工作。

然而,每次我从Qt Creator重新部署应用程序时,设置文件都会被销毁,导致我得出结论QSettings无法正常工作。

根据Bogdan本人的说法,这个问题应该已经在Qt Creator 3.2中得到解决。


0
你的代码唯一的问题是,在Android中,你必须使用QStandartPaths来获取路径,而不是QCoreApplication::applicationDirPath()QCoreApplication::applicationDirPath()会给你Windows应用程序路径,但在Android上无法工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接