簡體   English   中英

如何知道是否寫入流是否會導致java.io.IOException:寫入失敗:EBADF(錯誤的文件號)

[英]How to know whether writing to stream would result in java.io.IOException: write failed: EBADF (Bad file number)

我知道在java.io.IOException: write failed: EBADF (Bad file number)上有很多帖子java.io.IOException: write failed: EBADF (Bad file number)異常,但是似乎沒有一個可以回答我的特定問題:

假設我的活動被Intent.ACTION_VIEW調用,並且我通過Uri uri = intent.getData()獲得了一個Uri ,它以content://開頭,我從中讀取了一些數據(例如pdf文件)。 現在,我想確定是否也可以寫信給該Uri以決定是否應向用戶顯示“保存”按鈕,還是僅顯示“另存為”按鈕。

進一步假設我可以成功地首先打開一個ParcelFileDescriptor ,最后一個FileOutputStream

ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "w");
FileOutputStream fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());

這樣fileOutputStream != null

根據Uri ,如果我嘗試寫入fileOutputStream ,現在會發生異常:

Exception=java.io.IOException: write failed: EBADF (Bad file number)

我想提前知道在不實際觸摸/更改文件的情況下是否會發生這種情況。 有人認為,應該可以在嘗試之前找出我是否可以寫給定的Uri

我該如何實現?

其他觀察:

我想當我沒有權限寫入該特定文件/ uri時發生以上情況,但是為什么Android首先讓我打開FileOutputStream

為了進行測試,我在ICS設備上使用Kaiten郵件接收的電子郵件中使用附件。 如果我在Kaiten郵件中單擊“保存”后我的應用程序打開,則uri匹配content://media/external/file/[0-9]*並且一切正常,如果我單擊了“ open” uri匹配content://com.kaitenmail.attachmentprovider/[-0-9a-f]*/[0-9]*/VIEW ,我遇到上述錯誤。

顯然有兩種方法:

  1. 一個可以打電話

     Context.checkCallingUriPermission(Uri uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION) 

    檢查是否允許調用進程寫入給定的Uri

    對於情況下,我可以檢查,在API級<19,這似乎導致PackageManager.PERMISSION_DENIED每當寫入到輸出流指向uri失敗,並在PackageManager.PERMISSION_GRANTED在所有其他情況。

    對於> = 19的API級別,即使以前使用getContentResolver().takePersistableUriPermission(Uri uri, int takeFlags)獲得了持久的寫許可權,它也會產生PackageManager.PERMISSION_DENIED 但是在那種情況下,可以使用

     context.getContentResolver().getPersistedUriPermissions() 

    獲取所有先前獲得的權限的列表,然后仔細檢查它們,以便查看是否有寫給定Uri權限。

  2. 如果有人通過Intent intent獲得Uri ,則可以通過intent.getFlags()檢查其標志,並查看是否設置了Intent.FLAG_GRANT_WRITE_URI_PERMISSION 這似乎也是“預測未來”的一種方式。

顯然,以上兩種方法都不能作為未正確處理寫入流時可能發生的異常的借口。

測試任何資源是否可用的正確方法是嘗試使用它,並處理無法使用時導致的異常或錯誤。

其他任何事情都算命。 你可能

  • 測試錯誤的東西
  • 測試正確的東西,但得到的答案在測試時是正確的,但在實際使用時卻不正確。 這有兩種工作方式,但都不好:測試說不能,但是后來卻可以:或者測試說可以,但是后來就不能。

不要試圖預測未來。 應對目前的困難已經足夠了。

暫無
暫無

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

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