MediaScannerConnection производит android.app.ServiceConnectionLeaked
Я использую код примера MediaScannerConnection из API Demos
Используемый фрагмент:
MediaScannerConnection.scanFile(context,
new String[] { permFile.getAbsolutePath() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
android.util.Log.i("ExternalStorage", "Scanned " + path + ":");
android.util.Log.i("ExternalStorage", "-> uri=" + uri);
}
});
Когда я запускаю этот код, я получаю диалог FC со следующим из LogCat:
4-20 23:17:45.988: ERROR/ActivityThread(3015): Activity com.my.package.name has leaked ServiceConnection [email protected] that was originally bound here
04-20 23:17:45.988: ERROR/ActivityThread(3015): android.app.ServiceConnectionLeaked: Activity com.my.package.name has leaked ServiceConnection [email protected] that was originally bound here
Что я делаю неправильно?
FYI Я запускаю это из фонового потока, используя AsyncTask.
Ответы
Ответ 1
Я заметил такое же сообщение об ошибке, используя фрагмент кода, снабженный документацией Environment.getExternalStoragePublicDirectory.
Код работает отлично, как ожидалось, и делает новый файл видимым в галерее устройств, но в то же время печатает ошибку об leaked ServiceConnection
.
Глядя на внутренний код андроида MediaScannerConnection
, кажется, существует какой-то механизм для остановки службы после последнего файла. Может быть, это не сработает при задании только одного файла?
Я закончил использовать совершенно другое решение, сообщив MediaScanner через Intent. Это тоже прекрасно работает, и в нем нет предупреждений:
Intent mediaScannerIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri fileContentUri = Uri.fromFile(permFile); // With 'permFile' being the File object
mediaScannerIntent.setData(fileContentUri);
this.sendBroadcast(mediaScannerIntent); // With 'this' being the context, e.g. the activity
Кажется, это предпочтительный способ, так как он упоминается в Обучение Android о съемке.
Ответ 2
Используйте getApplicationContext()
вместо этого.
Ответ 3
У меня была эта проблема с распознающим голосом, когда я изменил макеты/и т.д.
Все, что мне нужно было сделать, это добавить unregisterReceiver, вроде как в onActivityResult:
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
unregisterReceiver(mReceiver);
super.onDestroy();
}
Надеюсь, что это поможет!