使用 QML 在 Android 上打开文件(Qt.openUrlExternally())



我想在Android上使用QML打开一个文件(.xls.pdf.png等)(如果iOS工作得更好)。

我正在尝试像这样使用它:

Qt.openUrlExternally(url)
/*Qt.openUrlExternally("http://www.example.com)"*/
/*Qt.openUrlExternally("file:///C:/Users/Hello/Pictures/Qt.jpg")*/

Internet URLLocal URL都可以在Windows上完美打开。互联网URL在Android上也可以工作,但是我无法Android上打开本地文件。

这是我在Android上尝试过的:

Qt.openUrlExternally("file:/storage/emulated/0/Documents/test_pdf.pdf")
Qt.openUrlExternally("file:///storage/emulated/0/Documents/test_pdf.pdf")
Qt.openUrlExternally(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/test_pdf.pdf")
Qt.openUrlExternally("content:///storage/emulated/0/Documents/test_pdf.pdf");

我知道这里有几个关于这个问题的问题,但没有人回答我,而且该示例也没有显示如何打开本地文件

顺便说一句,我有存储权限,文件肯定在那里。

编辑:如果我通过QMLs文件Dilog选择文件,这是我得到的URL:content://com.android.externalstorage.documents/document/primary%3ADocuments/%2F20BLOQUES.pdf

这是由于Android操作系统的限制。

您可以通过在应用程序的 Java 部分使用以下代码来禁用此限制(顺便说一下,也可以使用 C++ 编写):

import java.lang.reflect.Method;
import android.os.StrictMode;
import android.os.Build;
if (Build.VERSION.SDK_INT >= 24)
{
try
{
Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure");
m.invoke(null);
}catch(Exception e)
{
e.printStackTrace();
}
}

但是,Google不建议这样做,推荐的打开文件方法是使用content方案。您可以在此处更详细地阅读:https://www.qt.io/blog/2017/12/01/sharing-files-android-ios-qt-app。

因此,在与此问题作斗争之后,我得出了下一个结论和澄清:

  1. 我不能使用JAVAC++。我能使用的只是QML。这是一个名为Velneo的封闭软件平台,我只能访问QML端。

  2. 我不能使用file:///,它必须content:///。您可以在此处阅读有关此内容的更多信息。

  3. Android不会通过键入该路由来打开来自/storage/emulated/0/Documents/的文件。URL 的格式必须如下:content://com.android.externalstorage.documents/document/primary%3ADocuments%2Ftest_pdf.pdf(阅读 #2)。

  4. 它仅适用于 Android11,由于某种原因不适用于Android 10

我会接受这是正确的答案,因为就我而言,这是我所需要的,我可以满足我的要求。

只是发布此回复,以防有人有一天会发现自己处于相同的位置。

最新更新