Android 更改存储图片的图库相册名称
Android Change the Gallery Album name of stored Images
我正在尝试将图像保存到相册中的应用程序名称相册中,到目前为止,我设法将图像保存到相册中,但问题是相册名称始终是 "Pictures",我我检查了所有其他帖子,但对我没有任何帮助...
这是我的代码
val fileName = "abc"
val ImageToSave /*the image that I save, I send it value through method*/
val imageDir = File(activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES),"appName")
val image = File(imageDir,fileName)
if (!imageDir.exists())
imageDir.mkdirs()
val contentValues = ContentValues()
contentValues.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
contentValues.put(MediaStore.Images.Media.DATA, image.absolutePath)
contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
contentValues.put(MediaStore.Images.Media.BUCKET_DISPLAY_NAME, "appName")
val url = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)!!
val out = contentResolver.openOutputStream(url)
imageFromView.compress(Bitmap.CompressFormat.JPEG, 100, out)
Toast.makeText(activity, "saved", Toast.LENGTH_SHORT).show()
我保存图像没有任何问题我只是想更改相册名称。提前谢谢你...
更新
我尝试只创建不带 contentValue 的图像文件,但文件似乎有问题我不断收到错误提示 "File does not exist" 现在是我的代码
val imageDir = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "appName")
if (!imageDir.exists())
imageDir.mkdirs()
val image = File(imageDir, fileName)
if (!image.exists()) {
val out = FileOutputStream(image)
ImageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out)
Toast.makeText(activity, "saved", Toast.LENGTH_SHORT).show()
} else
Toast.makeText(activity, "Already saved", Toast.LENGTH_SHORT).show()
另外,我确保我的清单文件中有询问权限,当用户按下按钮时我正在请求权限...我确保我的应用程序有权读取和写入文件....
因为你在使用Environment.DIRECTORY_PICTURES
您应该创建一个自定义目录,下面是一个示例:
String path = Environment.getExternalStorageDirectory().toString();
File appDirectory = new File(path + "/" + "FolderName");
appDirectory.mkdirs();
经过大量研究,我找到了解决问题的方法,我所要做的就是添加
put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/AppName/")
这将在图片文件夹中创建一个包含您的应用程序名称的文件夹,在图库中,它将与您输入的应用程序名称一起显示...有关更多详细信息,请阅读 this link
我发现我写的代码中有很大一部分是不需要的,我最终删除了所有多余的东西,这就是最终结果
更新
我更新了代码,因此它也适用于 android 的旧版本
fun saveImage(itemImage: View, context: Context) {
val imageName: String
val imageToSave = getBitmapFromView(itemImage)
val exists: Boolean
ByteArrayOutputStream().apply {
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, this)
imageName = "ChatOut_" + UUID.nameUUIDFromBytes(this.toByteArray()).toString().replace("-", "") + ".jpg"
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
context.contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,arrayOf(MediaStore.Images.Media.DISPLAY_NAME), "${MediaStore.Images.Media.DISPLAY_NAME} = '$imageName' ", null, MediaStore.Images.ImageColumns.DATE_ADDED + " DESC").let {
exists = it?.count ?: 0 >= 1
it?.close()
}
if (!exists) {
val contentValues = ContentValues().apply {
put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
put(MediaStore.Images.Media.DISPLAY_NAME, imageName)
put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/ChatOut/")
}
val url = context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)!!
val out = context.contentResolver.openOutputStream(url)
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out)
Toast.makeText(context, "saved", Toast.LENGTH_SHORT).show()
} else
Toast.makeText(context, "Already saved", Toast.LENGTH_SHORT).show()
}else{
val imageDir = File("${Environment.getExternalStorageDirectory()}/ChatOut/")
if (!imageDir.exists())
imageDir.mkdirs()
val image = File(imageDir,imageName)
if (!image.exists()){
val outputStream = FileOutputStream(image)
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
outputStream.close()
val contentValues = ContentValues().apply {
put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
put(MediaStore.Images.Media.DISPLAY_NAME, imageName)
put(MediaStore.Images.Media.DATA, image.absolutePath)
}
context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
Toast.makeText(context, "saved", Toast.LENGTH_SHORT).show()
}else{
Toast.makeText(context, "Already saved", Toast.LENGTH_SHORT).show()
}
}
}
fun getBitmapFromView(view: View): Bitmap {
return Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888).apply {
Canvas(this).apply {
view.draw(this)
}
}
}
希望这对其他人有帮助 :) 玩得开心!
我正在尝试将图像保存到相册中的应用程序名称相册中,到目前为止,我设法将图像保存到相册中,但问题是相册名称始终是 "Pictures",我我检查了所有其他帖子,但对我没有任何帮助...
这是我的代码
val fileName = "abc"
val ImageToSave /*the image that I save, I send it value through method*/
val imageDir = File(activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES),"appName")
val image = File(imageDir,fileName)
if (!imageDir.exists())
imageDir.mkdirs()
val contentValues = ContentValues()
contentValues.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
contentValues.put(MediaStore.Images.Media.DATA, image.absolutePath)
contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
contentValues.put(MediaStore.Images.Media.BUCKET_DISPLAY_NAME, "appName")
val url = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)!!
val out = contentResolver.openOutputStream(url)
imageFromView.compress(Bitmap.CompressFormat.JPEG, 100, out)
Toast.makeText(activity, "saved", Toast.LENGTH_SHORT).show()
我保存图像没有任何问题我只是想更改相册名称。提前谢谢你...
更新
我尝试只创建不带 contentValue 的图像文件,但文件似乎有问题我不断收到错误提示 "File does not exist" 现在是我的代码
val imageDir = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "appName")
if (!imageDir.exists())
imageDir.mkdirs()
val image = File(imageDir, fileName)
if (!image.exists()) {
val out = FileOutputStream(image)
ImageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out)
Toast.makeText(activity, "saved", Toast.LENGTH_SHORT).show()
} else
Toast.makeText(activity, "Already saved", Toast.LENGTH_SHORT).show()
另外,我确保我的清单文件中有询问权限,当用户按下按钮时我正在请求权限...我确保我的应用程序有权读取和写入文件....
因为你在使用Environment.DIRECTORY_PICTURES
您应该创建一个自定义目录,下面是一个示例:
String path = Environment.getExternalStorageDirectory().toString();
File appDirectory = new File(path + "/" + "FolderName");
appDirectory.mkdirs();
经过大量研究,我找到了解决问题的方法,我所要做的就是添加
put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/AppName/")
这将在图片文件夹中创建一个包含您的应用程序名称的文件夹,在图库中,它将与您输入的应用程序名称一起显示...有关更多详细信息,请阅读 this link
我发现我写的代码中有很大一部分是不需要的,我最终删除了所有多余的东西,这就是最终结果
更新
我更新了代码,因此它也适用于 android 的旧版本
fun saveImage(itemImage: View, context: Context) {
val imageName: String
val imageToSave = getBitmapFromView(itemImage)
val exists: Boolean
ByteArrayOutputStream().apply {
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, this)
imageName = "ChatOut_" + UUID.nameUUIDFromBytes(this.toByteArray()).toString().replace("-", "") + ".jpg"
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
context.contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,arrayOf(MediaStore.Images.Media.DISPLAY_NAME), "${MediaStore.Images.Media.DISPLAY_NAME} = '$imageName' ", null, MediaStore.Images.ImageColumns.DATE_ADDED + " DESC").let {
exists = it?.count ?: 0 >= 1
it?.close()
}
if (!exists) {
val contentValues = ContentValues().apply {
put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
put(MediaStore.Images.Media.DISPLAY_NAME, imageName)
put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/ChatOut/")
}
val url = context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)!!
val out = context.contentResolver.openOutputStream(url)
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out)
Toast.makeText(context, "saved", Toast.LENGTH_SHORT).show()
} else
Toast.makeText(context, "Already saved", Toast.LENGTH_SHORT).show()
}else{
val imageDir = File("${Environment.getExternalStorageDirectory()}/ChatOut/")
if (!imageDir.exists())
imageDir.mkdirs()
val image = File(imageDir,imageName)
if (!image.exists()){
val outputStream = FileOutputStream(image)
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
outputStream.close()
val contentValues = ContentValues().apply {
put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
put(MediaStore.Images.Media.DISPLAY_NAME, imageName)
put(MediaStore.Images.Media.DATA, image.absolutePath)
}
context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
Toast.makeText(context, "saved", Toast.LENGTH_SHORT).show()
}else{
Toast.makeText(context, "Already saved", Toast.LENGTH_SHORT).show()
}
}
}
fun getBitmapFromView(view: View): Bitmap {
return Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888).apply {
Canvas(this).apply {
view.draw(this)
}
}
}
希望这对其他人有帮助 :) 玩得开心!