使用 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 URL 和 Local 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.
因此,在与此抗争之后,我得出了下一个结论和澄清:
我不能使用 JAVA 或 C++。我能用的只有QML。这是一个名为Velneo的封闭软件平台,我只能访问QML端。
我不能用file:///,必须是content:/// .您可以阅读更多相关信息 here。
Android 不会通过键入打开来自 /storage/emulated/0/Documents/ 的文件那条路线。 URL 的格式必须如下所示:content://com.android.externalstorage.documents/document/primary%3ADocuments%2Ftest_pdf.pdf (阅读#2).
它只适用于 Android 11,它不适用于 Android 10 出于某种原因。
我会接受这个作为正确答案,因为在我的情况下这是我需要的,我可以满足我的要求。
只是发布此回复,以防有一天有人会发现自己处于相同的境地。
我想打开一个文件 (.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 URL 和 Local 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.
因此,在与此抗争之后,我得出了下一个结论和澄清:
我不能使用 JAVA 或 C++。我能用的只有QML。这是一个名为Velneo的封闭软件平台,我只能访问QML端。
我不能用file:///,必须是content:/// .您可以阅读更多相关信息 here。
Android 不会通过键入打开来自 /storage/emulated/0/Documents/ 的文件那条路线。 URL 的格式必须如下所示:content://com.android.externalstorage.documents/document/primary%3ADocuments%2Ftest_pdf.pdf (阅读#2).
它只适用于 Android 11,它不适用于 Android 10 出于某种原因。
我会接受这个作为正确答案,因为在我的情况下这是我需要的,我可以满足我的要求。
只是发布此回复,以防有一天有人会发现自己处于相同的境地。