在Android 10.0上创建文件路径的正确方法
我使用此库从图像生成GIF文件,此库在初始化时需要一个路径,以便使用它保存最终的GIF,如下所示:在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
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
。