3

ユーザーが描画できるアプリがあり、その描画を .png ファイルとして外部ストレージ (存在する場合) に「エクスポート」します。PNG の生成、ファイルの外部へのコピーはすべて魔法のように機能しますが、かなりユニークな問題が発生します。エクスポート後、ユーザーがマイ ファイル (この場合は 2.2 を実行している Samsung タブ) を介して画像に移動すると、.png ファイルが表示されますが、開くと画面が約 10 秒間真っ暗になります... その後さらに、画像はユーザーの「ギャラリー」アプリにも表示されません。

これで、ユーザーがデバイスを USB 経由でコンピューターに接続するか、デバイスを再起動すると、マイ ファイルから問題なく画像にアクセスでき、その時点から [ギャラリー] に表示されますが、新しくエスポートされたファイルはすべて経験します。デバイスを再度サイクル/接続するまで、同じ問題が発生します。

私の考えでは、これはメディア スキャナーに関連している必要があると考えていました (少なくとも「ギャラリー」の問題の場合は、間違いなくそうです)。

そのため、Api 8 以降をターゲットにしているため、静的MediaScannerConnection.scanFile()メソッドを使用して OS を再スキャンし、画像をギャラリーに追加するなどを試みています。また、これにより、画像を開く際の奇妙な遅延の問題が解決されることを願っています。これが私のコードです:

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 カードを見つけられず、失敗しています。Samsung Tab には非 SD 外部ストレージが組み込まれており、Android は 経由でアクセスできますEnvironment.getExternalStorageDirectory()。非 SD ストレージをスキャンするように指示するにはどうすればよいですか?

続行する方法はありますか?

ポール

4

2 に答える 2

3

ここで解決策を見つけました。これには、インテントを介してメディア スキャナーにブロードキャスト リクエストを送信することが含まれます。

Android メディア データベースを更新する方法

で問題を把握したことはありませんMediaScannerConnection.scanFile

于 2011-04-04T22:21:08.153 に答える
0

ファイルを追加するときはいつでも、MediaStore コンテンツ プロバイダーに次のように認識させます。

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 に答える