android - 无法将位图转换为 Uri
问题描述
我使用以下代码转换Bitmap
为Uri
:
public Uri GetImageUriFunction(Context inContext, Bitmap inImage)
{
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
return Uri.parse(path);
}
但是,当我运行代码时,会发生以下异常:
java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=12433, uid=10438 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
at android.os.Parcel.createException(Parcel.java:1966)
at android.os.Parcel.readException(Parcel.java:1934)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
at android.content.ContentResolver.insert(ContentResolver.java:1593)
at android.provider.MediaStore$Images$Media.insertImage(MediaStore.java:1014)
我已经添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
到清单并在 App Settings 中启用了 Storage Permission。如何grantUriPermission()
在应用程序中实现这一点?
解决方案
如果您的应用需要危险的权限,您必须在每次执行需要该权限的操作时检查您是否拥有该权限。从 Android 6.0(API 级别 23)开始,用户可以随时撤消任何应用的权限,即使该应用的目标 API 级别较低。因此,即使应用程序昨天使用了相机,它也不能假设它今天仍然拥有该权限。
要检查您是否有权限,请调用 ContextCompat.checkSelfPermission() 方法。例如,此代码段显示如何检查活动是否有权写入日历
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR)
!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
}
例如
从媒体中挑选图像
private fun pickImage() {
if (ActivityCompat.checkSelfPermission(
this,
READ_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
this,
WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED
) {
val i = Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
)
startActivityForResult(i, PICK_IMAGE_REQUEST_CODE)
} else {
ActivityCompat.requestPermissions(
this,
arrayOf(READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE),
READ_EXTERNAL_STORAGE_REQUEST_CODE
)
}
}
推荐阅读
- python - Bqplot 在动画的每一步都渲染新的条形图,而不是移动原始的条形图
- python - button.bind 不调用函数 tkinter
- cordova - 带有 Ionic 4 的 IndoorAtlas cordova 插件
- jenkins - Jenkins - 如何在构建执行程序列表中为节点创建组?
- php - 不使用正则表达式的 PHP 验证表单
- css - 在 Boostrap 导航栏的角度组件中覆盖 styles.css
- python - 如何在 Mac OS 上使用 Tkinter 获取黑色文件对话框?
- c++ - 如何使用 fmod(浮点数)检查 - 并获得余数?
- python - 将 CSV 文件读入 Numpy 数组
- c# - ASP.Net MVC C# 分配角色关闭复选框和用户列表