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.