首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >迁移到适用于Android的范围存储Q

迁移到适用于Android的范围存储Q
EN

Stack Overflow用户
提问于 2019-08-05 23:56:59
回答 1查看 2.3K关注 0票数 4

当用户在我的应用程序中拍照时,图片会保存在本地的内部存储中。然后我还允许移动到外部存储器,在那里他们可以抓取,然后通过将设备插入计算机并在他们需要的情况下将它们从那里取下。

我会这样做的

代码语言:javascript
运行
复制
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,我不确定如何将文件保存到同一文件夹中。

我试着去做

代码语言:javascript
运行
复制
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的一些基本内容,我不确定它是什么

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-06 01:18:30

正如Mike指出的,在插入到内容解析器之后,我必须使用来自uri的输出流来保存图像,所以一个向后兼容的示例如下所示。

代码语言:javascript
运行
复制
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()
        }
    }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57362150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档