问题描述
我正在开发一个应用程序,其中应用程序使用当前日期作为文件名写入日志文件
例如:20200710.txt
早期版本在android 10之前运行良好,但是从android 10开始,代码不再将文件写入外部存储中。
string logDir = "Documents/MyApp_Data/logs/";
Context context = MyApplication.Context;
ContentValues values = new ContentValues();
values.Put(MediaStore.MediaColumns.displayName,filename);
values.Put(MediaStore.MediaColumns.MimeType,"text/plain"); //file extension,will automatically add to file
values.Put(MediaStore.MediaColumns.RelativePath,logDir);
var uri = context.ContentResolver.Insert(MediaStore.Files.GetContentUri("external"),values);
Stream outputStream = context.ContentResolver.OpenOutputStream(uri,"rw");
outputStream.Write(Encoding.UTF8.GetBytes(message));
outputStream.Close();
以上代码适用于android 10,但它正在创建多个日志文件,如果文件已经存在,我想更新该文件。我没有办法检查文件是否存在,然后在现有文件中追加新数据。有人可以让我知道吗?上面的代码在Xamarin android中,但是如果您有任何建议可以在android中使用,那么我会将其转换为Xamarin android
预先感谢
解决方法
此代码纠正了(尤其是单词的大写/小写)vaibhav的问题,并使用blackapps建议添加了文本附加内容。可以写txt或json。 可以在持久性文件夹(例如/ storage / self / Downloads)中写文本,而无需在Android 10+上进行用户交互(实际上未在11上进行测试,但应该可以使用)。
// filename can be a String for a new file,or an Uri to append it
fun saveTextQ(ctx: Context,relpathOrUri: Any,text: String,dir: String = Environment.DIRECTORY_DOWNLOADS):Uri?{
val fileUri = when (relpathOrUri) {
is String -> {
// create new file
val mime = if (relpathOrUri.endsWith("json")) "application/json"
else "text/plain"
val values = ContentValues()
values.put(MediaStore.MediaColumns.DISPLAY_NAME,relpathOrUri)
values.put(MediaStore.MediaColumns.MIME_TYPE,mime) //file extension,will automatically add to file
values.put(MediaStore.MediaColumns.RELATIVE_PATH,dir)
ctx.contentResolver.insert(MediaStore.Files.getContentUri("external"),values) ?: return null
}
is Uri -> relpathOrUri // use given Uri to append existing file
else -> return null
}
val outputStream = ctx.contentResolver.openOutputStream(fileUri,"wa") ?: return null
outputStream.write(text.toByteArray(charset("UTF-8")))
outputStream.close()
return fileUri // return Uri to then allow append
}