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

Open file on Android with QML (Qt.openUrlExternally())

我想打开一个文件 (.xls, .pdf, .png等)在 Android 上使用 QML(如果 iOS 有效甚至更好)。

我正在尝试这样使用它:

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

Internet URLLocal URL 都可以在 [ 上完美打开=76=]Internet URL 也适用于 Android,但是 我不能Android.

打开一个 local 文件

这是我试过的 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 fileDilog 选择文件,这是 URL 我得到:content://com.android.externalstorage.documents/document/primary%3ADocuments/%2F20BLOQUES.pdf

这是由于 Android OS 的限制。

您可以在应用程序的 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:/// .您可以阅读更多相关信息 here

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

  4. 它只适用于 Android 11,它不适用于 Android 10 出于某种原因。

我会接受这个作为正确答案,因为在我的情况下这是我需要的,我可以满足我的要求。

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