Подтвердить что ты не робот

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.

4b9b3361

Ответ 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();
    }     

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