我在QML图像项目上显示存储在内部存储中的图像文件时遇到问题。我尝试了很多东西,但无法弄明白我怎样才能实现它。任何帮助表示赞赏。
QML方面:
Image {
id: userPhotoDrawer;
anchors.centerIn: parent;
width : Math.min(parent.width , parent.height);
height : width;
sourceSize: Qt.size(width , height);
source: "file:///storage/emulated/0/Documents/share_example_x_files/qt-logo.png"
}
MouseArea
{
anchors.fill: parent;
onClicked: Caminho.buscaImagem();
}
Connections
{
target: Caminho;
onImagemCaminhoChanged:
{
var path = Caminho.imagemCaminho;
Caminho.checkPath(path);
}
}
}
在caminhoImagens.cpp中:
QString caminhoImagens::checkPath(QString pPath)
{
QFile tFile(pPath);
QStringList tList = pPath.split("/");
QString fileName = tList.last();
QString header = pPath.split(fileName).first();
QDir tdir(header);
if (tdir.exists())
{
qDebug() << "absolute path : " << tdir.absoluteFilePath(fileName)
<< endl << "file exists : " << tFile.exists();
}
return QUrl::fromLocalFile(pPath).toString();}
说明,我使用图像选择器在我的应用程序中设置用户照片。我根据上面的功能输出得到了正确的路径。例如, 文件:///storage/emulated/0/Documents/share_example_x_files/qt-logo.png
我还尝试通过以下方式设置来源: 来源:/storage/emulated/0/Documents/share_example_x_files/qt-logo.png
没有任何改变。输出仍然是::QML图片:无法打开:file:///storage/emulated/0/Documents/share_example_x_files/qt-logo.png
我还在清单文件下添加了以下权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
感谢您的帮助
答案 0 :(得分:1)
在尝试将文件复制到另一个地方后,我通过挖掘QFile :: errorString找到了解决方案。该错误被许可拒绝!
在我搜索了为什么即使我在清单文件上需要权限时也出现此错误,我发现在KitKat之后,Android希望在应用程序上授予用户权限。因此,在选择Image之前,我将请求权限功能放入我的QML中。
MouseArea
{
anchors.fill: parent;
onClicked:
{
if (PermissionManager.requestPermissions())
Caminho.buscaImagem();
}
}
相关的cpp代码:
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;}