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