3

我有一个用户可以使用的应用程序,然后将该绘图作为 .png 文件“导出”到外部存储(如果存在)。生成PNG,将文件复制到外部都像魅力一样工作,但发生了一个相当独特的问题;导出后,如果用户通过我的文件导航到图像(在这种情况下,三星 Tab 运行 2.2),他们可以看到 .png 文件,但是当他们打开它时,屏幕黑屏大约 10 秒......然后他们看到图像,此外,图像也不会显示在用户的“图库”应用程序中。

现在,如果用户通过 USB 将设备连接到计算机,或重新启动设备,他们可以毫无问题地从我的文件中访问图像,并且从那时起它们会出现在“图库”中,但同样,任何新的 esported 文件体验相同的问题,直到他们再次循环/连接设备。

我的想法是这必须与媒体扫描仪有关(至少在“画廊”问题的情况下,它肯定是)。

因此,当我针对 Api 8+ 时,我正在尝试使用静态MediaScannerConnection.scanFile()方法让操作系统重新扫描并将我的图像添加到图库等。也希望这能解决打开图像时出现奇怪延迟的问题。这是我的代码:

MediaScannerConnection.scanFile(
  context, 
  new String[] { "/mnt/sdcard/MyApp" }, 
  null, 
  null
);

当我导出图像时,LogCat 会为我提供以下条目,从而运行上述调用:

DEBUG/MediaScannerService(2567): IMediaScannerService.scanFile: /mnt/sdcard/MyApp mimeType: null
DEBUG/MediaScannerService(2567): onStartCommand : intent - Intent { cmp=com.android.providers.media/.MediaScannerService (has extras) }
DEBUG/MediaScannerService(2567): onStartCommand : flags [0], startId [1]
DEBUG/MediaScannerService(2567): ServiceHandler:handleMessage volume[null], filePath[/mnt/sdcard/MyApp]
DEBUG/MediaProvider(2567): getSdSerial() sd state = removed
INFO/Database(2567): sqlite returned: error code = 17, msg = prepared statement aborts at 43: [SELECT DISTINCT sd_serial FROM images WHERE sd_serial LIKE 'external_0x%']
ERROR/MediaProvider(2567): removeMediaDBData called
DEBUG/MediaScanner(2567): prescan enter: path - /mnt/sdcard/MyApp
DEBUG/MediaScanner(2567): prescan return

因此,看起来 MediaScanner 正在获取正确的位置,但未能找到正确的 SD 卡,并且失败了。三星 Tab 具有内置的非 SD 外部存储,Android 可以通过Environment.getExternalStorageDirectory(). 我如何告诉它扫描非 SD 存储?

任何想法如何进行?

保罗

4

2 回答 2

3

在这里找到了解决方案,其中包括通过 Intent 向媒体扫描器发送广播请求:

如何更新 Android 媒体数据库

从来没有弄清楚这个问题MediaScannerConnection.scanFile

于 2011-04-04T22:21:08.153 回答
0

每当您添加文件时,让 MediaStore Content Provider 使用

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(imageAddedOrDeleted)));

主要优势:使用 MediaStore 支持的任何 mime 类型

对于删除:只需使用 getContentResolver().delete(uri, null, null)

于 2013-02-13T08:59:11.313 回答