安卓应用生成的外部存储CSV文件需重启设备才能在PC端显示如何解决
Xamarin Forms Datalogic扫描器MTP文件不显示解决方案
根因说明
该问题是安卓MTP媒体传输协议的缓存机制导致的:安卓系统不会实时将新增的普通文件同步到MTP的可见索引中,只有触发索引更新后PC端才能看到文件。Datalogic定制ROM默认限制了非媒体类文件的自动扫描,所以常规的MediaScanner调用很容易失效。
可行解决方案
显式指定MIME类型调用MediaScanner
未指定CSV文件的MIME类型时,多数定制ROM会将非媒体文件的扫描请求直接过滤,调用时需明确传入text/csv类型,示例代码如下:string targetCsvPath = "你的CSV文件绝对路径"; MediaScannerConnection.ScanFile( Android.App.Application.Context, new string[] { targetCsvPath }, new string[] { "text/csv" }, (path, uri) => { /* 扫描完成回调可留空 */ } );强制刷新文件缓冲区后再扫描
嵌入式安卓设备默认闪存同步策略保守,写入文件后如果未强制刷入物理存储,MTP会无法识别到新增文件,修改写文件逻辑:using (FileStream fs = new FileStream(csvSavePath, FileMode.Create, FileAccess.Write)) using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8)) { // 写入CSV内容逻辑 sw.WriteLine("barcode,scan_time"); // 强制刷新所有缓冲区 sw.Flush(); fs.Flush(); // 强制同步到底层存储 fs.SafeFileHandle.Flush(); } // 缓冲区刷新完成后再执行MediaScanner扫描触发公共存储分区全量扫描(安卓10及以下)
单文件扫描不生效时,可以发送广播触发整个外部公共存储的MTP索引更新:if (Android.OS.Build.VERSION.SdkInt <= Android.OS.BuildVersionCodes.Q) { Intent scanIntent = new Intent(Intent.ActionMediaScannerScanFile); Android.Net.Uri storageUri = Android.Net.Uri.FromFile( Android.OS.Environment.ExternalStorageDirectory ); scanIntent.SetData(storageUri); Android.App.Application.Context.SendBroadcast(scanIntent); }调整Datalogic设备专属配置
Datalogic扫描器的定制系统默认关闭了MTP实时刷新开关,可手动开启:- 进入系统
设置 > 存储 > 右上角菜单 > USB计算机连接,确认勾选「媒体设备(MTP)」 - 进入
设置 > 系统 > USB > Enable MTP file listing refresh,打开该定制开关即可实现文件自动同步到MTP列表
- 进入系统
兜底方案:使用存储访问框架(SAF)创建文件
上述方案都不生效时,不要直接用File API写入公共目录,改用安卓SAF创建CSV文件,系统会自动触发MTP索引更新,无需额外扫描操作。
内容的提问来源于stack exchange,提问作者HBBob
相关产品推荐
相关产品推荐

