当用户在我的应用程序中拍照时,图片会保存在本地的内部存储中。然后我还允许移动到外部存储器,在那里他们可以抓取,然后通过将设备插入计算机并在他们需要的情况下将它们从那里取下。
我会这样做的
val tempDir = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "My_App_Folder")
val baseFile = File(filePath)
if(baseFile.exists()){
val targetFile = File(directory.path+File.separator+targetFileName)
baseFile.copyTo(targetFile)
baseFile.delete()
}
图像会像我想要的那样在Pictures/My_App_Folder
中结束
现在尝试移动到MediaStore
以支持scoped storage
,我不确定如何将文件保存到同一文件夹中。
我试着去做
val values:ContentValues = ContentValues()
values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpg")
values.put(MediaStore.Images.Media.DATE_ADDED,System.currentTimeMillis() / 1000)
values.put(MediaStore.Images.Media.TITLE, targetFileName)
values.put(MediaStore.Images.Media.DISPLAY_NAME, targetFileName)
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
values.put(MediaStore.Images.Media.DATE_TAKEN,System.currentTimeMillis())
values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES+"/My_App_Folder")
uri = contentResolver.insert(MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL),values)
}else{
uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values)
}
但现在该文件夹中什么也没有出现,我觉得我遗漏了MediaStore的一些基本内容,我不确定它是什么
发布于 2019-08-05 17:18:30
正如Mike指出的,在插入到内容解析器之后,我必须使用来自uri的输出流来保存图像,所以一个向后兼容的示例如下所示。
private fun saveFileToExternalStorage(directory:File?,filePath:String,targetFileName:String){
var uri:Uri? = null
val values:ContentValues = ContentValues()
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpg")
values.put(MediaStore.Images.Media.DATE_ADDED,System.currentTimeMillis() / 1000)
values.put(MediaStore.Images.Media.TITLE, targetFileName)
values.put(MediaStore.Images.Media.DISPLAY_NAME, targetFileName)
values.put(MediaStore.Images.Media.DATE_TAKEN,System.currentTimeMillis())
values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES+"/My_App_Folder")
values.put(MediaStore.Images.Media.IS_PENDING, 1)
uri= contentResolver.insert(MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY),values)
}
val baseFile = File(filePath)
if(baseFile.exists()){
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q){
directory?.let {
val targetFile = File(it.path+File.separator+targetFileName)
baseFile.copyTo(targetFile)
}
}else{
uri?.let {
val outputStream: OutputStream? = contentResolver.openOutputStream(uri)
outputStream?.let{
val inputStream: InputStream = File(filePath).inputStream()
inputStream.copyTo(outputStream,1024)
}
values.clear()
values.put(MediaStore.Images.Media.IS_PENDING, 0)
contentResolver.update(uri,values,null,null)
}
}
baseFile.delete()
}
}
https://stackoverflow.com/questions/57362150
复制相似问题