以下のようなコードはうまくいきそうだが、実際には状況によってはうまくいかない。
final Object lock = new Object(); synchronized (lock) { Log.d(TAG, "ScanFile Start"); MediaScannerConnection.scanFile(context, new String[] { filePath }, null, new OnScanCompletedListener() { @Override public void onScanCompleted(String path, Uri uri) { Log.d(TAG, "onScanCompleted"); synchronized (lock) { lock.notify(); } } }); try { Log.d(TAG, "lock start"); lock.wait(); Log.d(TAG, "unlocked"); } catch (InterruptedException e) { e.printStackTrace(); } }
その状況とは、このコードがUIスレッドで動いている場合。
おそらくMediaScannerServiceへconnectしてonMediaScannerConnectedを待つあたりでUIスレッドが動いていないと駄目なんだろうなーと。
というわけで、回避策としては非同期にできるところまでさかのぼって、別スレッドで動かすしかなさそう。
というわけで、回避策としては非同期にできるところまでさかのぼって、別スレッドで動かすしかなさそう。
それが嫌なら、MediaScannerConnection インスタンスを作って(事前にサービスへの接続をしておいて)scanFileすればいけるんじゃないですかね(試してません)。