如何保存android位图并无限期访问它



我允许用户创建一个图像。当他们点击";创建";,我将屏幕上的图像保存为位图,然后将返回到本地存储器的内容URI(content://com.android.providers.media.documents/document/image%3A1000003643(保存,以便稍后从中读取以显示图像。我相信这只会允许我临时访问,因为我在尝试在应用的另一个部分显示图像时,在短时间后出现以下错误

D/AsyncImageError: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord (pid=20027, uid=10663) requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs

有人知道保存图像然后随时无限期访问它的最佳方法吗?

保存位图本地存储。

try {
val bitmapDims = ImageUtils.getBitmapDims(BackgroundRemoverActivity.selectedImageUri, this@SmoothActivity
)
val i = bitmapDims.outWidth
var i2 = bitmapDims.outHeight
val smoothActivity = this@SmoothActivity
if (i > i2) {
i2 = i
}
smoothActivity.saveBitmap(i2)
} catch (e: Exception) {
e.printStackTrace()
}

fun saveBitmap(i: Int) {
dimension = i
showDialog = false
val show = ProgressDialog.show(
this,
"",
getString(if (gotoShare) R.string.save_image_ else R.string.processing_image),
true
)
show.setCancelable(false)
Thread(Runnable {
val str: String
try {
//                val file = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "/" + HelperClass.FOLDER_NAME)
val file = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
"/" + HelperClass.FOLDER_NAME
)
if (!file.exists()) {
if (!file.mkdirs()) {
Log.d("", "Can't create directory to save image.")
Toast.makeText(
this@SmoothActivity.applicationContext,
"Can't create directory to save image.",
1
).show()
return@Runnable
}
}
val sb = StringBuilder()
sb.append("Photo_")
sb.append(System.currentTimeMillis())
val sb2 = sb.toString()
str = if (inPNG) {
val sb3 = StringBuilder()
sb3.append(sb2)
sb3.append(".png")
sb3.toString()
} else {
val sb4 = StringBuilder()
sb4.append(sb2)
sb4.append(".jpg")
sb4.toString()
}
val smoothActivity = this@SmoothActivity
val sb5 = StringBuilder()
sb5.append(file.path)
sb5.append(File.separator)
sb5.append(str)
smoothActivity.filename = sb5.toString()
val file2 = File(filename)
if (inPNG) {
savePNGImage(file2, i)
show.dismiss()
} else {
saveJPGImage(file2, i)
show.dismiss()
}
Thread.sleep(1000)
show.dismiss()
} catch (e: Exception) {
e.printStackTrace()
}
}).start()
show.setOnDismissListener { dialogInterface: DialogInterface? ->
if (showDialog) {
if (gotoShare) {
val applicationContext = this@SmoothActivity.applicationContext
val sb = StringBuilder()
sb.append(this@SmoothActivity.getString(R.string.saved))
sb.append(" ")
sb.append(filename)
Toast.makeText(applicationContext, sb.toString(), Toast.LENGTH_SHORT).show()
val intent = Intent(this@SmoothActivity, ShareActivity::class.java)
intent.putExtra("path", filename)
intent.putExtra("showTbg", inPNG)
this@SmoothActivity.startActivity(intent)
HelperClass.showPopAdWithCount(this)
//  HelperClass.showPopAd(SmoothActivity.this);
return@setOnDismissListener
/* onBackPressed()*/
}
val intent = Intent(this@SmoothActivity, BackgroundChangerActivity::class.java)
intent.putExtra("value", "2")
this@SmoothActivity.startActivity(intent)
Log.d("ttpscheckitem",filename.toString()+ "smooth");
/*onBackPressed()*/
} else if (gotoShare) {
val create = AlertDialog.Builder(
this@SmoothActivity,
if (VERSION.SDK_INT >= 14) 16974126 else 16973835
).setTitle(this@SmoothActivity.resources.getString(R.string.resolution_error_title))
.setMessage(this@SmoothActivity.resources.getString(R.string.rsolution_error_msg))
.setCancelable(false)
.setPositiveButton(this@SmoothActivity.resources.getString(R.string.ok)) { dialogInterface, i1 -> showResolutionOptDialog() }
.create()
create.window!!.attributes.windowAnimations = R.style.DialogAnimation_
create.show()
}
}
}

获取当地的肮脏形象;

final List loadAllImages=loadAllImages(Environment.getExternalStoragePublicDirectory(Environt.DIRECTORY_DOWNLOADS(.toString(((;this.cutoutAdapter=新的cutoutAdapter(this,loadAllImages(;this.cutout_recyclerview.setAdapter(cutoutAdapter(;

最新更新