无法将位图转换为 Uri
Cannot Convert Bitmap to 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"
添加到清单中并 在应用程序设置中启用了存储权限 。如何在应用程序中实现此 grantUriPermission()
?
如果您的应用需要危险权限,您必须在每次执行需要该权限的操作时检查您是否拥有该权限。从 Android 6.0(API 级别 23)开始,用户可以随时撤销任何应用程序的权限,即使该应用程序的目标 API 级别较低。因此,即使该应用昨天使用了摄像头,也不能假定它今天仍然拥有该权限。
要检查您是否有权限,请调用 ContextCompat.checkSelfPermission() 方法。例如,此代码段显示如何检查 activity 是否有权写入日历
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
)
}
}
这里是运行时权限的例子。
这是相机和 WRITE_EXTERNAL_STORAGE 的示例。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int hasPermissionCamera = checkSelfPermission(Manifest.permission.CAMERA);
int hasPermissionStorage = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (hasPermissionCamera != PackageManager.PERMISSION_GRANTED || hasPermissionStorage != PackageManager.PERMISSION_GRANTED) {
if (!addPermission(permissionsList, Manifest.permission.CAMERA))
permissionsNeeded.add("Camera");
if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE))
permissionsNeeded.add("Read External Storage");
if (permissionsList.size() > 0) {
if (permissionsNeeded.size() > 0) {
String message = "You need to allow " + permissionsNeeded.get(0);
for (int i = 1; i < permissionsNeeded.size(); i++)
message = message + ", " + permissionsNeeded.get(i);
message = message + " permissions for add image.";
showMessageOKCancel(message,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
});
return;
}
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
return;
}
}
}
permissionsNeeded 是 ArrayList
用于检查在多个权限的情况下授予或不授予哪些权限
public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 1;
public boolean checkPermission(
final Context context) {
int currentAPIVersion = Build.VERSION.SDK_INT;
if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(
(Activity) context,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
showDialog("storage", context,
Manifest.permission.READ_EXTERNAL_STORAGE);
} else {
ActivityCompat
.requestPermissions(
(Activity) context,
new String[] { Manifest.permission.READ_EXTERNAL_STORAGE },
MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}
return false;
} else {
return true;
}
} else {
return true;
}
}
在 activity
中使用它
if (checkPermissionREAD_EXTERNAL_STORAGE(this)) {
// do your stuff..
}
onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// do your stuff
} else {
Toast.makeText(Login.this, "GET_ACCOUNTS Denied",
Toast.LENGTH_SHORT).show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions,
grantResults);
}
}
显示对话框:
public void showDialog(final String msg, final Context context,
final String permission) {
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context);
alertBuilder.setCancelable(true);
alertBuilder.setTitle("Permission necessary");
alertBuilder.setMessage(msg + " permission is necessary");
alertBuilder.setPositiveButton(android.R.string.yes,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions((Activity) context,
new String[] { permission },
MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}
});
AlertDialog alert = alertBuilder.create();
alert.show();
}
我使用下面的代码将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"
添加到清单中并 在应用程序设置中启用了存储权限 。如何在应用程序中实现此 grantUriPermission()
?
如果您的应用需要危险权限,您必须在每次执行需要该权限的操作时检查您是否拥有该权限。从 Android 6.0(API 级别 23)开始,用户可以随时撤销任何应用程序的权限,即使该应用程序的目标 API 级别较低。因此,即使该应用昨天使用了摄像头,也不能假定它今天仍然拥有该权限。
要检查您是否有权限,请调用 ContextCompat.checkSelfPermission() 方法。例如,此代码段显示如何检查 activity 是否有权写入日历
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
)
}
}
这里是运行时权限的例子。
这是相机和 WRITE_EXTERNAL_STORAGE 的示例。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int hasPermissionCamera = checkSelfPermission(Manifest.permission.CAMERA);
int hasPermissionStorage = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (hasPermissionCamera != PackageManager.PERMISSION_GRANTED || hasPermissionStorage != PackageManager.PERMISSION_GRANTED) {
if (!addPermission(permissionsList, Manifest.permission.CAMERA))
permissionsNeeded.add("Camera");
if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE))
permissionsNeeded.add("Read External Storage");
if (permissionsList.size() > 0) {
if (permissionsNeeded.size() > 0) {
String message = "You need to allow " + permissionsNeeded.get(0);
for (int i = 1; i < permissionsNeeded.size(); i++)
message = message + ", " + permissionsNeeded.get(i);
message = message + " permissions for add image.";
showMessageOKCancel(message,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
});
return;
}
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
return;
}
}
}
permissionsNeeded 是 ArrayList
用于检查在多个权限的情况下授予或不授予哪些权限
public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 1;
public boolean checkPermission(
final Context context) {
int currentAPIVersion = Build.VERSION.SDK_INT;
if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(
(Activity) context,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
showDialog("storage", context,
Manifest.permission.READ_EXTERNAL_STORAGE);
} else {
ActivityCompat
.requestPermissions(
(Activity) context,
new String[] { Manifest.permission.READ_EXTERNAL_STORAGE },
MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}
return false;
} else {
return true;
}
} else {
return true;
}
}
在 activity
中使用它if (checkPermissionREAD_EXTERNAL_STORAGE(this)) {
// do your stuff..
}
onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// do your stuff
} else {
Toast.makeText(Login.this, "GET_ACCOUNTS Denied",
Toast.LENGTH_SHORT).show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions,
grantResults);
}
}
显示对话框:
public void showDialog(final String msg, final Context context,
final String permission) {
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context);
alertBuilder.setCancelable(true);
alertBuilder.setTitle("Permission necessary");
alertBuilder.setMessage(msg + " permission is necessary");
alertBuilder.setPositiveButton(android.R.string.yes,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions((Activity) context,
new String[] { permission },
MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}
});
AlertDialog alert = alertBuilder.create();
alert.show();
}