2016-04-29 50 views
1

我試圖接受圖像與我的應用程序發送到服務器。設置意圖過濾器非常簡單,它就像一個魅力。我似乎無法弄清楚的事情是我需要從意圖中的uri中檢索文件路徑的方式。從操作收到的意圖發送在URI上產生SecurityException

我收到我的活動意圖與此過濾器

<intent-filter> 
    <action android:name="android.intent.action.SEND" /> 
    <action android:name="android.intent.action.SEND_MULTIPLE" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <data android:mimeType="image/jpeg" /> 
    <data android:mimeType="image/png" /> 
    <data android:mimeType="image/gif" /> 
</intent-filter> 

通過嘗試處理URI通過調用takePersistableUriPermission(URI,modeFlags)來獲取文件路徑我得到這個錯誤:

java.lang.SecurityException: No persistable permission grants found for UID 10098 and Uri 0 @ content://media/external/images/media/124 

我使用的邏輯適用於從我的應用程序中請求圖像,但從應用程序外部接收意圖會產生錯誤。

KitKat及以上:

final int flags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
    final String[] imageColumns = {MediaStore.Images.Media.DATA}; 
    getActivity().getContentResolver().takePersistableUriPermission(uri, flags); 
    String id = uri.getLastPathSegment().split(":")[1]; 
    Cursor imageCursor = context.managedQuery(getStorageUri(), imageColumns, MediaStore.Images.Media._ID + "=" + id, null, null); 
+0

您是否在Android 6.0及以上版本發生了此錯誤? –

+0

因爲你設置了android:exported =「false」,這意味着其他進程無法訪問這個Activity。所以你把它設置爲true,並做同樣的事情,它不會崩潰 –

+0

@SanjayKakadiya沒有kitkat和以上,只是測試確定。 – SjoerdvGestel

回答

0

我似乎無法弄清楚的事情是我需要檢索的目的URI中的文件路徑的方式。

沒有「來自uri的文件路徑」。 A Uri不是一個文件。

試圖通過散文中的URI通過調用takePersistableUriPermission(URI,modeFlags)來獲取文件路徑我得到這個錯誤:

這只是意味着,一旦你的過程結束,你不能使用Uri

KitKat及以上:

ACTION_GET_CONTENT沒有義務回到你一些Uri可以使用代碼來處理。

消耗Uri,use openInputStream() on your ContentResolver標識的內容。

+0

我想你誤解了我的問題。一個,我知道該URI不包含文件路徑,因此我需要處理它來獲取文件路徑。我在這裏使用了一個intent過濾器,它將從另一個發送該內容的應用程序接收一個意圖,而不是'ACTION_GET_CONTENT'開始活動的結果。 – SjoerdvGestel

+1

@SjoerdvGestel:「因此我需要處理它以獲取文件路徑」 - 您不能「處理它以獲取文件路徑」,除了可能使用'openInputStream()'將內容複製到某個文件控制。用戶不需要選擇可以通過文件系統訪問的一段內容。內容可能在另一個應用程序的內部存儲器上,也可能在可移動存儲器上,或另一個應用程序數據庫的BLOB列中,或者在需要由其他應用程序下載的「雲」中。 – CommonsWare

+1

@SjoerdvGestel:同樣,沒有要求第三方應用程序授予您持久權限的Uri。這是由其他應用程序提供的;你不能強迫開發者提供它,而不能使用重型武器。 – CommonsWare