在Android 10.0上创建文件路径的正确方法

在Android 10.0上创建文件路径的正确方法,android,uri,filepath,mediastore,android-10.0,Android,Uri,Filepath,Mediastore,Android 10.0,我使用此库从图像生成GIF文件,此库在初始化时需要一个路径,以便使用它保存最终的GIF,如下所示: gifEncoder.init(width, height, FILEPATH , GifEncoder.EncodingType.ENCODING_TYPE_NORMAL_LOW_MEMORY); 为此,我尝试创建一个GIF文件并为库提供路径: String gifFileName = "APP" + Constants.CURRENT_DATE + ".gif"; String pict

我使用此库从图像生成GIF文件,此库在初始化时需要一个路径,以便使用它保存最终的GIF,如下所示:

gifEncoder.init(width, height, FILEPATH , GifEncoder.EncodingType.ENCODING_TYPE_NORMAL_LOW_MEMORY);
为此,我尝试创建一个GIF文件并为库提供路径:

 String gifFileName = "APP" + Constants.CURRENT_DATE + ".gif";
 String pictureFolderPath = Environment.DIRECTORY_PICTURES + Constants.BaseFolder;
 String pathImageKey = MediaStore.Images.Media.DATA;

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            Uri insertedUri = getGIFUri(context, gifFileName, pictureFolderPath);
            String correctPath = queryFilePath4Uri(context, insertedUri, pathImageKey);
            Log.d("Correct Path", correctPath.toString());
            return correctPath;
} 
在log cat中,我可以看到路径:

2020-06-07 11:11:48.878 7570-7745/maa.app.abc D/Correct Path: /storage/emulated/0/Pictures/MYAPP/GIFs/APP20200607_101138.gif

但是,当我在Android 10(Emulator)上测试它时,什么也没有发生,保存的GIF变为空,大小为0个八位字节,下面是
getGIFUri
queryFilePath4Uri
方法:

 fun getGIFUri(context: Context, fileName: String, dirName: String): Uri? {
        val values = ContentValues().apply {
            put(MediaStore.Images.Media.TITLE, fileName)
            put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
            put(MediaStore.Images.Media.DESCRIPTION, "APP")
            put(MediaStore.Images.Media.MIME_TYPE, "image/gif")
            put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
            put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis())
            put(MediaStore.Images.Media.RELATIVE_PATH, "$dirName/GIFs")
        }
        var result: Uri? = null
        val contentResolver = context.contentResolver
        contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values).let { insertUri ->
            result = insertUri
        }
        return result;
    }

fun queryFilePath4Uri(context: Context, uri: Uri, pathKey: String): String? {
    context.contentResolver?.query(uri, null, null, null, null)?.use {
        val isHas = it.moveToFirst()
        if (isHas) {
            val dataIndex = it.getColumnIndex(pathKey)
            if (dataIndex != -1) {
                val data = it.getString(dataIndex)
                if (!TextUtils.isEmpty(data)) {
                    return data
                }
            }
        }
    }
    return uri.path
}
我正在使用这个库生成一个GIF编码器,从图像生成一个GIF文件

那个图书馆有点旧了

此库在初始化时需要一个路径,以便


使用基于
上下文
方法的
文件,例如
getFilesDir()
getExternalFilesDir()
。然后,在创建GIF后,稍后将其移动到公共目录。或者,找到一个支持
OutputStream
Uri
作为写入目标的库。

如果需要文件系统路径,则不要使用媒体存储,而是使用getExternalFilesDir()。在Android Q下,您使用的路径不可读写。
queryFilePath4Uri()
如果您有uri,请不要尝试获取路径。归档时间结束了。它的uri时间。您好@blackapps非常感谢您的评论,如果您可以使用GetExternalFileDir()作为文件的目录,请给我一个示例。不是您现在拥有的。@blackapps这并不意味着文件将在缓存中创建?,因为我想稍后将GIF文件保存到库中。非常感谢您的回答,可以将文件从getExternalFilesDir()路径移动到库中吗?@MouaadAbdelghafourAITALI:我不会使用“移动”作为动词。在Android 10+上,您可以通过
MediaStore
存储图像。在from中,我以这种方式使用
MediaStore
。就我而言,我正在下载一段视频。您的主要更改是集合(改为使用
Images
)和
InputStream
的来源(您将在基于
getExternalFilesDir()
文件上使用
FileInputStream
)@MouaadAbdelghafourAITALI:如果您有一个更现代的GIF库,可以接受
OutputStream
Uri
作为目标,那么您可以跳过
getExternalFilesDir()
,让库直接写入
MediaStore
提供的
Uri