FileObserver не всегда запускает новые файлы

Я пишу и использую файл json на SD-карте устройства Android в качестве основной конфигурации. Это коммерческое приложение, и оно должно обновляться, когда новый файл загружается на устройство через MDM или другой. У меня нет доступа к настройке MDM, поэтому я тестировал обновления файла конфигурации, передавая файлы конфигурации на устройство через ADB:

adb push config.json /sdcard/MyApp/

Все с моими наблюдателями файлов, кажется, работает правильно; если я удаляю файл с устройства, он распознается. Если я создаю новый файл в каталоге, за которым следят, он распознается. Если я изменяю файл конфигурации, просматриваемый на устройстве, он распознается. Тем не менее, описанная выше операция ADB, хотя она и была успешной при копировании / отправке файла на устройство, не приводит к запуску каких-либо событий в моем FileObserver.

Я написал тестовое приложение, чтобы продемонстрировать проблему. Обратите внимание на фильтр FileObserver.ALL_EVENTS:

private static String BASE_DIRECTORY_NAME = "test_directory";

private static FileObserver fileObserver = null;

@Override
public void onCreate() {
    super.onCreate();

    int readPermissionCheck = ContextCompat.checkSelfPermission(getApplicationContext(),
            Manifest.permission.READ_EXTERNAL_STORAGE);

    int writePermissionCheck = ContextCompat.checkSelfPermission(getApplicationContext(),
            Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if(readPermissionCheck == PackageManager.PERMISSION_GRANTED && writePermissionCheck == PackageManager.PERMISSION_GRANTED) {
        final File directory = getFileHandle(getApplicationContext(), "");

        if(!directory.exists()) {
            directory.mkdirs();
        }

        fileObserver = new MyFileObserver(directory.getAbsolutePath(), FileObserver.ALL_EVENTS);
        fileObserver.startWatching();
    }
}

Мой обозреватель файлов просто определен для выхода из системы события и пути относительно контролируемого файла / каталога:

public class MyFileObserver extends FileObserver {
private static final String TAG = MyFileObserver.class.getSimpleName();

public MyFileObserver(String path, int mask) {
    super(path, mask);
}

@Override
public void onEvent(int event, @Nullable String path) {
    Log.d(TAG, "Event: " + event + " Path: " + path);
}
}

Когда я вручную создаю файл в контролируемом каталоге, это показывает:

03-06 10:19:08.953 14653-14668/org.ruby.fileobservertest D/MyFileObserver: Event: 256 Path: test5.txt
03-06 10:19:08.953 14653-14668/org.ruby.fileobservertest D/MyFileObserver: Event: 32 Path: test5.txt
03-06 10:19:08.954 14653-14668/org.ruby.fileobservertest D/MyFileObserver: Event: 8 Path: test5.txt
03-06 10:19:08.959 14653-14668/org.ruby.fileobservertest D/MyFileObserver: Event: 1073741856 Path: null
03-06 10:19:08.960 14653-14668/org.ruby.fileobservertest D/MyFileObserver: Event: 1073741840 Path: null

Эти журналы представляют CREATE, OPEN и CLOSE_WRITE, что и происходит. Есть два дополнительных события, которые не имеют четкого определения: 1073741856 и 1073741840, но, похоже, они связаны с приложением "Диспетчер файлов", которое я использую на устройстве, читающем файлы для обновления отображения каталога.

Когда я удаляю один из этих файлов, снова все, как и ожидалось:

03-06 10:21:21.255 14653-14668/org.ruby.fileobservertest D/MyFileObserver: Event: 512 Path: test5.txt
03-06 10:21:21.346 14653-14668/org.ruby.fileobservertest D/MyFileObserver: Event: 1073741856 Path: null
03-06 10:21:21.347 14653-14668/org.ruby.fileobservertest D/MyFileObserver: Event: 1073741840 Path: null

Если я переименую файл:

03-06 10:21:57.033 14653-14668/org.ruby.fileobservertest D/MyFileObserver: Event: 64 Path: test.txt
03-06 10:21:57.033 14653-14668/org.ruby.fileobservertest D/MyFileObserver: Event: 128 Path: test5.txt
03-06 10:21:57.099 14653-14668/org.ruby.fileobservertest D/MyFileObserver: Event: 1073741856 Path: null
03-06 10:21:57.100 14653-14668/org.ruby.fileobservertest D/MyFileObserver: Event: 1073741840 Path: null

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

03-06 10:22:47.308 14653-14668/org.ruby.fileobservertest D/MyFileObserver: Event: 1073741856 Path: null
03-06 10:22:47.312 14653-14668/org.ruby.fileobservertest D/MyFileObserver: Event: 1073741840 Path: null

Итак, несколько вопросов. Прежде всего, есть ли причина, по которой при объявлении фильтра ALL_EVENTS на FileObserver файлы, передаваемые через ADB, не вызывают никаких событий? Меня беспокоит, что это операция, которую МДМ выполняет под прикрытием, и я пропущу все эти события.

Другой мой вопрос: почему два вышеуказанных события просмотра, 1073741856 и 1073741840, вообще не находятся в javadoc FileObserver? Я вижу некоторые ссылки на эти цифры здесь, но полученные результаты все еще не имеют смысла для меня.

Это тестируется на нескольких устройствах; Журнальные сообщения, приведенные выше, относятся к устройству Android 6.0.1.

0 ответов

Другие вопросы по тегам