MediaScannerConnection создает android.app.ServiceConnectionLeaked - PullRequest
29 голосов
/ 21 апреля 2011

Я использую пример кода MediaScannerConnection из API-демонстраций

Фрагмент, который я использую:

    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 android.media.MediaScannerConnection@40715c70 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 android.media.MediaScannerConnection@40715c70 that was originally bound here

Что я делаю не так? К вашему сведению, я запускаю это из фонового потока, используя AsyncTask.

Ответы [ 3 ]

29 голосов
/ 10 октября 2012

Я заметил сообщение об ошибке того же типа, используя фрагмент кода, предоставленный вместе с документацией Environment.getExternalStoragePublicDirectory .

Код работает нормально, как и ожидалось, и создает новый файлотображается в галерее устройств , но в то же время печатает сообщение об ошибке leaked ServiceConnection.

. Глядя на внутренний код Android 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-тренинге по съемке фотографий тоже.

11 голосов
/ 20 августа 2014

Используйте getApplicationContext() вместо.

0 голосов
/ 08 октября 2012

У меня была эта проблема с распознавателем голоса, когда я менял раскладки и т. Д. Все, что мне нужно было сделать, это добавить unregisterReceiver, вроде этого в onActivityResult:

@Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        unregisterReceiver(mReceiver);
        super.onDestroy();
    }     

Надеюсь, это поможет!

...