在Android 10API 29中将数据追加到文本文件

问题描述

我正在开发一个应用程序,其中应用程序使用当前日期作为文件名写入日志文件

例如:20200710.txt

早期版本在android 10之前运行良好,但是从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
    }