簡體   English   中英

使用 QML (Qt.openUrlExternally()) 打開 Android 上的文件

[英]Open file on Android with QML (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")*/

Inte.net URL本地 URL都在Windows上完美打開。 Inte.net 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 fileDilog選擇文件,這是我得到的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();
    }
}

但是,谷歌不推薦,推薦的文件打開方式是使用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. 它僅適用於Android 11 ,出於某種原因不適用於Android 10

我會接受這個作為正確答案只是因為在我的情況下這是我需要的,我可以滿足我的要求。

只是發布此回復以防萬一有人有一天會發現自己在同一個 position 中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM