我正在使用该库来GIFEncoder,以便从图像生成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;
}
在日志猫中,我可以看到路径:
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 (仿真器)上对其进行测试时,没有任何反应,保存的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
}
答案 0 :(得分:1)
我将这个库用于GIFEncoder,以便从图像生成GIF文件
那个图书馆有点老了。
此库在初始化时需要一个路径
基于File
上的方法,例如Context
或getFilesDir()
使用getExternalFilesDir()
。然后,在创建GIF之后,稍后将其移动到公共目录。或者,找到支持OutputStream
或Uri
作为写入目标的库。