Android MediaScanner в UncaughtExceptionHandler не сканирует файл

Я реализовал обработчик исключений в своем приложении, который создает файл дампа при сбое приложения из-за неперехваченного исключения, а затем передает обработчик исключений по умолчанию.

Файл создается с правильным содержимым, но он не виден на подключенном ПК, если я не запускаю сканирование носителя вручную. Я добавил код для запуска сканирования мультимедиа в новом файле, как показано ниже:

    Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
        public void uncaughtException(Thread t, Throwable e) {
            Context c = getApplicationContext();
            File dumpDir = c.getExternalFilesDir(null);
            DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.ROOT);
            fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
            String fileName = String.format("dump-%s.log", fmt.format(new Date(System.currentTimeMillis())));

            File dumpFile = new File (dumpDir, fileName);
            PrintStream s;
            try {
                InputStream buildInStream = getResources().openRawResource(R.raw.build);
                // write dump
                s.flush();
                s.close();
                String [] scanPaths = {dumpFile.toString()};
                MediaScannerConnection.scanFile(c, scanPaths, null, null);
            } catch (FileNotFoundException e2) {
                e2.printStackTrace();
            }
            defaultUEH.uncaughtException(t, e);
        }
    });

Однако файл по-прежнему не появляется, пока я вручную не запускаю полное сканирование носителя. Вставив операторы журнала, я мог убедиться, что мой код выполняется до конца после запуска сканирования носителя.

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

Подозревая, что приложение будет уничтожено до завершения сканирования и что в результате сканер мультимедиа прервет сканирование, я реализовал OnScanCompletedListener, который устанавливает флаг после завершения сканирования и ждет, пока этот флаг будет установлен. Однако этот слушатель, кажется, никогда не вызывается.

Правильно ли мое подозрение? Что здесь не так? Как я могу убедиться, что медиа-сканер сканирует файл?


person user149408    schedule 14.04.2016    source источник


Ответы (1)


Понятно. Я не знаю, почему именно вышеперечисленное не работает, но отправка Intent вместо того, чтобы полагаться на MediaScannerConnection, сработала.

Заменять

String [] scanPaths = {dumpFile.toString()};
MediaScannerConnection.scanFile(c, scanPaths, null, null);

с

Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(dumpFile);
mediaScanIntent.setData(contentUri);
c.sendBroadcast(mediaScanIntent);

и файл дампа появляется сразу после сбоя.

person user149408    schedule 14.04.2016
comment
Примечание. В Android 4.2 сканер может повторно сканировать только все устройство, в то время как в Android-5.0 вы можете попросить сканер сканировать только определенный файл. Поэтому выполнение этого на более старом Android с большим количеством файлов может стать проблемой. на моем планшете Android 4.2 у меня есть 17000 фотографий на SD-карте, и сканирование может занять несколько часов. - person k3b; 14.04.2016
comment
Согласно документам, Intent существует с уровня API 1. Означает ли это, что он вызовет полное сканирование в более ранних версиях? - person user149408; 14.04.2016
comment
по крайней мере, на моем андроиде-4.2 он запускает полное сканирование - person k3b; 14.04.2016