簡體   English   中英

Android從uri打開文件輸入流

[英]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.

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