MediaScanner ServiceConnectionLeaked

use*_*926 7 android android-mediascanner

我使用这个类在SDCard中扫描我的应用程序图像.

public class SingleMediaScanner implements MediaScannerConnectionClient {

private MediaScannerConnection mMs;
private File mFile;

public SingleMediaScanner(Context context, File f) {
    mFile = f;
    mMs = new MediaScannerConnection(context, this);
    mMs.connect();
}

@Override
public void onMediaScannerConnected() {
    mMs.scanFile(mFile.getAbsolutePath(), null);
}

@Override
public void onScanCompleted(String path, Uri uri) {
    mMs.disconnect();
}
}
Run Code Online (Sandbox Code Playgroud)

它工作但在我的LogCat中它总是显示错误:

12-29 16:44:16.022: ERROR/ActivityThread(21807): Activity com.cny.ecard.CustomListDialog has leaked ServiceConnection android.media.MediaScannerConnection@450fb8e0 that was originally bound here
12-29 16:44:16.022: ERROR/ActivityThread(21807): android.app.ServiceConnectionLeaked: Activity com.cny.ecard.CustomListDialog has leaked ServiceConnection android.media.MediaScannerConnection@450fb8e0 that was originally bound here
12-29 16:44:16.022: ERROR/ActivityThread(21807):     at android.app.ActivityThread$PackageInfo$ServiceDispatcher.<init>(ActivityThread.java:1121)
12-29 16:44:16.022: ERROR/ActivityThread(21807):     at android.app.ActivityThread$PackageInfo.getServiceDispatcher(ActivityThread.java:1016)
12-29 16:44:16.022: ERROR/ActivityThread(21807):     at android.app.ContextImpl.bindService(ContextImpl.java:863)
12-29 16:44:16.022: ERROR/ActivityThread(21807):     at android.content.ContextWrapper.bindService(ContextWrapper.java:347)
12-29 16:44:16.022: ERROR/ActivityThread(21807):     at android.media.MediaScannerConnection.connect(MediaScannerConnection.java:117)
12-29 16:44:16.022: ERROR/ActivityThread(21807):     at com.cny.ecard.SingleMediaScanner.<init>(SingleMediaScanner.java:19)
Run Code Online (Sandbox Code Playgroud)

问题是什么?谢谢.

acj*_*acj 15

对于扫描单个文件,或从无法绑定到服务的上下文(例如,来自a BroadcastReceiver)扫描文件,user430926的注释应该是一个单独的答案:

Uri contentUri = Uri.fromFile(file);
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);
Run Code Online (Sandbox Code Playgroud)

  • One-liner:`sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,Uri.fromFile(file))); (5认同)
  • 此方法不再适用,因为从Nougat开始,文件不能以公共意图公开,并且您收到安全性异常 (2认同)