如何在Android 6.0中刷新媒体库?

时间:2016-01-18 08:17:31

标签: android media

在Android4.4中,可以发送广播接收者ACTION_MEDIA_SCANNER_SCAN_FILE来强制刷新媒体库,但它在5.0或6.0中不起作用。当我将mp3文件添加到手机的foler然后媒体库刷新默认时,但是当我删除mp3文件时,它无法正常刷新。 MediaScannerConnection.scanFile(),此方法也不起作用。

ContentResolver cr = context.getContentResolver();

    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

    StringBuffer sb = new StringBuffer();
    sb.append(MediaStore.Audio.Media.SIZE + " > " + FILTER_SIZE);
    sb.append(" and "+MediaStore.Audio.Media.IS_MUSIC + " !=0");
    sb.append(" and " + MediaStore.Audio.Media.DURATION + " > " + FILTER_DURATION);

    Cursor cursor = cr.query(uri, proj_music, sb.toString(), null, MediaStore.Audio.Media.ARTIST_KEY);

这些是我用来查找所有mp3文件的代码。当用户删除mp3文件(不仅仅是代码,也许使用文件管理器)时,除非重启系统,否则Android媒体库无法刷新。我不想强制刷新媒体库。但ACTION_MEDIA_SCANNER_SCAN_FILE在android>中不起作用4.4,MediaScannerConnection.scanFile()此代码也不起作用。删除的mp3文件仍在数据库记录中。

private void refresh1() {
    String path = Environment.getExternalStorageDirectory().getPath()+"/kgmusic/download/";
    MediaScannerConnection.scanFile(this, new String[]{path}, new String[]{"mp3/*"}, null);
}

private void refresh2() {

    mScanReceiver = new MyScanReceiver();

    IntentFilter intentfilter = new IntentFilter( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    intentfilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
    intentfilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
    registerReceiver(mScanReceiver, intentfilter);

    String path = Environment.getExternalStorageDirectory().getPath()+"/kgmusic/download/";

    Uri contentUri = Uri.fromFile(new File(path));
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,contentUri);
    sendBroadcast(mediaScanIntent);
}

private class MyScanReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(Intent.ACTION_MEDIA_SCANNER_STARTED)) {
            System.out.println("scan start");
        } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) {
            System.out.println("scan finish");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我也遇到过这个问题,我就这样解决了。

在API级别19(KITKAT 4.4)中不推荐使用sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));,首先我必须检查设备是否高于API级别19,如果是,则MediaScannerConnection.scanFile()方法为真。

final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
if (isKitKat) {
    MediaScannerConnection.scanFile(context, new String[]{file.getPath()}, new String[]{"mp3/*"}, null);
} else {
    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
          + Environment.getExternalStorageDirectory())));
}

我希望它有所帮助。