由於我是Android新手,因此需要有關此問題的幫助。openInputStream cause SecurityException:權限拒絕(Android N +)
我的應用程序支持果凍豆(16)高達奧利奧(26)。
我有一個上傳服務,需要openInputStream()
上傳數據,因爲牛軋糖的新行爲。
此代碼在棉花糖及以下工作正常,但總是讓我012b崩潰牛軋糖。而且它崩潰在哪裏openInputStream()
被稱爲與錯誤行:
java.lang.SecurityException異常:權限拒絕:閱讀com.miui.gallery.provider.GalleryOpenProvider URI內容://com.miui.gallery 。開/原料/%2Fstorage%2Femulated%2f0的%2FDCIM%2FCamera從PID = 30846%2FIMG_20171008_182834.jpg,UID = 10195要求提供商被導出,或grantUriPermission()
的文件URI可以是來自各種應用程序(畫廊,相機等)。我已經將問題縮小到來自ACTION_GET_CONTENT
意圖的uri(任何來自相機意圖或MediaRecorder的意圖都可以正常工作)。
我認爲這是因爲uri在傳入服務時失去了權限,但添加Intent.FLAG_GRANT_WRITE_URI_PERMISSION
和Intent.FLAG_GRANT_READ_URI_PERMISSION
並沒有幫助。
也嘗試添加FLAG_GRANT_PERSISTABLE_URI_PERMISSION
標誌,但它仍然崩潰和getContentResolver().takePersistableUriPermission()
導致另一個SecurityException
崩潰稱說URI沒有被授予持久化的URI ...
UploadService.java
//.......... code to prepare for upload
if (contentResolver != null && schemeContentFile) {
mMime = UtilMedia.getMime(this, uri);
try {
InputStream is = contentResolver.openInputStream(uri);
byte[] mBytes = getBytes(is);
Bundle fileDetail = UtilMedia.getFileDetailFromUri(this, uri);
Log.d("AndroidRuntime", TAG + " " + mMime + " " + UtilToString.bundleToString(fileDetail) + " imageFile " + mFile);
currTitle = fileDetail.getString(OpenableColumns.DISPLAY_NAME, "");
MediaType type = MediaType.parse(mMime);
requestFile = RequestBody.create(type, mBytes);
} catch (IOException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
}
//............continue to upload
先謝謝你。
編輯(附加信息) 萬一這很重要。調用服務的活動在向服務發送所有必需的數據之後調用finish()
,讓用戶使用應用程序,同時在後臺繼續上傳(通知告訴用戶)。而且,上傳工作基於隊列,用戶可以選擇在活動中上傳多個文件。第一個文件總是被上傳,但文件總是在崩潰後返回。
某些設備不允許從相機或圖片目錄中讀取文件的權限。如果您從其他目錄上傳文件,問題是否存在? –
感謝您的建議!我現在沒有牛軋糖設備,但當我這樣做時我會嘗試。哦,我可以得到mime(該功能也使用ContentResolver和相同的uri),這是否意味着讀/寫uri權限在當時處於啓用狀態,但不知何故需要其他權限才能直接讀取文件? –
所以,我嘗試了你的建議@NabinBhandari,但它仍然給我同樣的例外。爲了以防萬一,我還編輯了我的帖子以添加更多信息。 –