簡體   English   中英

提供ACTION_OPEN_DOCUMENT的默認路徑

[英]Supply default path for ACTION_OPEN_DOCUMENT

在我的應用程序中,我想為用戶提供一種從應用程序的數據目錄中選擇文件的方法。 這是我的代碼:

// use ACTION_OPEN_DOCUMENT because ACTION_GET_CONTENT will give us
// gallery and other stuff we don’t need
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
Uri uri = Uri.parse(getExternalFilesDir(null).getAbsolutePath());
Log.d(TAG, "Browsing " + uri.toString());
intent.setDataAndType(uri, "*/*");
// show the entire internal storage tree
intent.putExtra("android.content.extra.SHOW_ADVANCED", true);
startActivityForResult(intent, 42);

Logcat向我顯示我正在設置的URI是file:///sdcard/Android/data/my.app/files ,但是文件選擇器UI默認為共享存儲根( /sdcard )。

以下代碼有效(根據文檔要求使用API​​ 26+,該意圖可從該文檔作為DocumentsContract.EXTRA_INITIAL_URI ):

// works only with this intent, at the expense of gallery etc. appearing
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);

// apparently we need a valid content URI
Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary%3AAndroid%2Fdata%2Fmy.app%2Ffiles");

intent.putExtra("android.provider.extra.INITIAL_URI", uri);

Log.d(TAG, "Browsing " + uri.toString());
intent.setType("*/*");
// show the entire internal storage tree
intent.putExtra("android.content.extra.SHOW_ADVANCED", true);
startActivityForResult(intent, 42);
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri);

但是,當我需要的只是本地文件系統(實際上只是應用程序的私有子樹)時, ACTION_GET_CONTENT會導致出現各種類型的提供程序,例如Gallery和Music。 如果我將意圖更改為ACTION_OPEN_DOCUMENT ,那么我提供的URI將被忽略。

我如何才能使文件選擇器UI在您選擇的目錄中啟動,而內容提供商的選擇卻很少?

編輯:在Anbox上進行測試,我才意識到這僅在API 25上進行-實際上,我需要一種可在24級以下的API上工作的方法。

可能沒有一個普遍可行的解決方案,但是以下內容已在某些構建中起作用(盡管不適用於其他構建):

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);

Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary%3AAndroid%2Fdata%2Fmy.app%2Ffiles");

intent.setData(uri);
intent.setType("*/*");
intent.putExtra("android.provider.extra.INITIAL_URI", uri);
intent.putExtra("android.content.extra.SHOW_ADVANCED", true);

startActivityForResult(intent, 42);

uri必須是com.android.externalstorage.documents提供程序的content URI。 URI路徑為/document/primary%3A ,后跟要開始的文件夾的文件系統路徑。該路徑必須相對於共享存儲根(即,在設備上刪除開頭的/sdcard/或等效文件,並確保結果不以斜杠開頭)並轉義。

Intent#setData()的調用無助於設置默認位置(與某些第三方文件管理器不同),但可以防止顯示不需要的存儲提供程序(例如Gallery和Music)。

android.provider.extra.INITIAL_URI額外設置了初始URI,但這可能在API 26之前不起作用(盡管它在某些Android版本上也有效)。

android.content.extra.SHOW_ADVANCED額外導致設備存儲可作為提供程序使用(否則,取決於Android的風格,它可能要求用戶選擇它或根本不使用它)。

同樣,仍然不是一個完美的解決方案,但我設法獲得了最接近的解決方案。

暫無
暫無

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

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