2016-08-14 59 views
0

使用Android 6.0.1,API 23,SAF(存儲訪問框架)如何識別您的USB記憶棒?

如何在顯示所有匹配文檔提供程序(包括您的USB記憶棒)的SAF選取器中看到連接到您的Android手機的USB棒?此外如何設置SAF以便在USB便攜式存儲器上創建文件和文件夾?

SAF-documentation,我想:

public void performFileSearch() { 

    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 

    intent.addCategory(Intent.CATEGORY_OPENABLE); 

    // in my case, showing only text-files is enough, therefore I guess the type is as follows: 
    intent.setType("text/plain"); 

    startActivityForResult(intent, READ_REQUEST_CODE); 
} 

但USB移動存儲不是選擇器的選擇的一部分......

我缺少什麼?是否有示例項目顯示必要的步驟?

@CommonsWare:這裏所需的截圖:

enter image description here

+0

「我缺少什麼?」 - 您缺少顯示「ACTION_OPEN_DOCUMENT」用戶界面中看到的屏幕截圖。 「是否有示例項目顯示必要步驟?」 - [示例應用程序](https://github.com/commonsguy/cw-omnibus/tree/master/Documents/TinyTextEditor)在我的Nexus 5X上使用USB-OTG驅動器可以正常工作,以創建或打開文件。它使用與您擁有的代碼相同的代碼。 – CommonsWare

+0

謝謝 - 我會看看你的項目(很難克隆,很難...)。目前,我還沒有一個工作示例項目,因爲我對Android的SAF世界都很陌生。我最感到困惑的是我的應用程序如何訪問USB驅動器?它是否需要第二個提供SAF-DocumentProvider的應用程序,或者我的應用程序是否也可以這樣做 - 如果是的話,具體如何?我缺少的是如何我的應用程序將識別任何USB驅動器連接。在權限和SAF方法方面究竟有什麼需要? – iKK

+0

「最令我困惑的是我的應用程序如何訪問USB驅動器?」 - 你會在'onActivityResult()'中得到一個'Uri',你可以使用'ContentResolver','DocumentFile'等。「它需要第二個提供SAF-DocumentProvider的應用程序,或者我的應用程序可以做到這一點以及 - 如果是的話,究竟是如何?「 - 由設備提供。如果你的設備沒有這樣做,那麼你的設備製造商或定製ROM開發者就搞砸了。再一次,你的代碼很好。這就是爲什麼我建議你張貼你所看到的截圖。 – CommonsWare

回答

1

我只是找到了一個解決問題的辦法:

具有SAF-客戶端應用程序啓動(如found here) - 包括我的小變化裏面performFileSearch()(即intent.setType("text/plain");而不是原來的DevBytesesample,intent.setType("image/*");,解決辦法如下:

如果進入「設置」(即,三個垂直點),您可以選擇:「顯示內部存儲」 - 這就是它!

之後,連接任何USB棒顯示在SAF的ContentProvider選擇器(請參見下面的屏幕截圖)中所需的!

...不知道爲什麼一個外部連接的USB棒作爲「內部存儲」? (如果有人知道這個謎題的答案,我非常感謝它!)...無論如何,很高興終於看到USB閃存出現!

enter image description here

+1

啊,我一直忘記它可以被切換,這就是我看到它的原因。我討厭這個SAF的這個方面。在這種情況下,「內部」基本上是指「文件系統」。如果您安裝了Google Drive或Dropbox或其他各種應用程序,則無論是啓用還是禁用「內部」存儲,它們都會出現在選取器中。我很遺憾忘記這件事。 – CommonsWare

+0

請不要這樣。無論如何,通過堅持使用screeenshots,你還能幫助我很多:)並且還提到代碼很好。這有幫助!謝謝。 – iKK

+0

Dropbox不會顯示,因爲它不支持SAF。你需要發送一個'ACTION_GET_CONTENT'來讓Dropbox出現。 –