[英]Android open file input stream from uri
我正在嘗試通過將文件從移動應用程序復制到 Windows 上運行的服務器應用程序來上傳文件。 我使用文件選擇器讓用戶選擇文件:
public void openFile(View view) {
Intent intent = new Intent();
intent.setType("*/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select file"), LEARN_TREE);
}
然后我從 onActivityResult 的意圖中得到了 uri。 這里的第一個問題是為什么它將名為“servo.dat”的文件顯示為數字(在本例中顯示為“5889”)?
之后,我將 uri 作為額外內容放入另一個意圖中,並使用該意圖開始另一個活動。 在第二個活動中,我檢索 uri。 現在我想使用 FileInputStream 從我的文件中讀取字節,以便將它們寫入從 Socket.getOutputStream() 創建的 ObjectOutputStream。 這是它不起作用的地方。 基本上這里提供的路徑
FileInputStream fis = new FileInputStream(uri.getPath());
是不正確的。 如果我在我的設備上檢查文件位置是 Download/servo.dat,應用程序中的 Uri 顯示 Download/5889,而我嘗試使用在線找到的 UriUtils 庫檢索的絕對路徑顯示 storage/emulated/0/Download/servo。 dat 但這個在我的手機上實際上並不存在。
我認為這並不難,但我很困惑,因為我是 Android 應用程序開發和 Android 本身的新手,請幫忙!
我對任何好的解決方案持開放態度,我在網上看到應該有幫助的 ContentResolver 類,但我無法理解如何使用它:|
這里的第一個問題是為什么它將名為“servo.dat”的文件顯示為數字(在本例中顯示為“5889”)?
因為它不是一個文件。 它是一段內容,您試圖將Uri
的路徑部分視為文件系統路徑,但Uri
並非如此。
如果您想要內容的顯示名稱:
DocumentFile.fromSingleUri()
,傳入您的Uri
,以創建一個DocumentFile
DocumentFile
上調用getDisplayName
基本上這里提供的路徑不正確
那是因為您試圖將Uri
的路徑部分視為文件系統路徑,而事實並非如此。
要獲取InputStream
,請在ContentResolver
上調用openInputStream()
,傳入您的Uri
。 請參閱文檔。 因此,例如,從Activity
的方法中,您將使用InputStream inputStream = getContentResolver().openInputStream(uri);
.
我很困惑,因為我是 Android 應用程序開發和 Android 本身的新手
您可能希望考慮閱讀有關 Android 應用程序開發的書籍或參加 Android 應用程序開發課程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.