gpt4 book ai didi

android - openInputStream 导致 SecurityException :Permission Denial (Android N+)

转载 作者:搜寻专家 更新时间:2023-11-01 08:24:27 28 4
gpt4 key购买 nike

由于我是 Android 新手,所以我需要帮助解决这个问题。

我的应用支持 JellyBean (16)Oreo (26)

我有一个 UploadService 需要 openInputStream() 来上传数据,因为 Nougat 中的新行为。

此代码在 Marshmallow 及以下版本中运行良好,但在 Nougat 上总是给我 SecurityException 崩溃。它在调用 openInputStream() 的行上崩溃,并出现 error:

java.lang.SecurityException: Permission Denial: reading com.miui.gallery.provider.GalleryOpenProvider uri content://com.miui.gallery.open/raw/%2Fstorage%2Femulated%2F0%2FDCIM%2FCamera%2FIMG_20171008_182834.jpg from pid=30846, uid=10195 requires the provider be exported, or grantUriPermission()

文件 uri 可以来自各种应用程序(图库、相机等)。我已将问题缩小到来自 ACTION_GET_CONTENT Intent 的 uri(任何来自相机 Intent 或 MediaRecorder 的都可以正常工作)。

我认为这是因为 uri 在传递到服务时失去了权限,但是添加 Intent.FLAG_GRANT_WRITE_URI_PERMISSIONIntent.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

提前致谢。

编辑(附加信息)如果这很重要。调用该服务的 Activity 在将所有必需的数据发送到该服务后调用 finish(),让用户使用该应用程序,同时在后台恢复上传(并通知用户)。而且,上传基于队列,用户可以选择在 Activity 中上传多个文件。第一个文件总是被上传,但之后的文件总是随着崩溃返回。

最佳答案

我终于设法解决了这个问题。显然它,因为给定 uri 的权限仅在接收 Activity 处于 Activity 状态时才有效。因此,将 uri 发送到后台服务(上传服务)将导致 SecurityException。正如预期的那样,除非 uri 是可持久化的 uri(即来自 ACTION_OPEN_DOCUMENT )。

所以我的解决方案是将文件复制到我的应用程序创建的文件并使用 FileProvider.getUriForFile()函数获取 uri 并将其发送到后台服务,并在我的服务完成上传后删除副本。即使在调用 Activity 完成后,这也能正常工作。

关于android - openInputStream 导致 SecurityException :Permission Denial (Android N+),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46684243/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com