在Android 11及以上版本中,FileObserver的功能受到了限制。为了解决这个问题,可以使用以下步骤:
private static final int REQUEST_CODE_OPEN_DOCUMENT = 2;
private static final String MIME_TYPE_IMAGE = "image/*";
private void openFileSelector() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType(MIME_TYPE_IMAGE);
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_OPEN_DOCUMENT && resultCode == RESULT_OK) {
Uri documentUri = data.getData();
if (documentUri != null) {
try {
InputStream inputStream = getContentResolver().openInputStream(documentUri);
// 您现在可以使用该文件流进行操作
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}
private WatchService watchService;
private WatchKey watchKey;
private void startWatchingFile(Uri documentUri) {
try {
File watchedFile = new File(documentUri.getPath());
Path watchedFilePath = watchedFile.toPath().toRealPath();
Path directoryPath = watchedFilePath.getParent();
watchService = FileSystems.getDefault().newWatchService();
watchKey = directoryPath.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
WatchKey key = watchService.take();
for (WatchEvent> event : key.pollEvents()) {
Path eventPath = (Path) event.context();
if (eventPath.getFileName().equals(watchedFilePath.getFileName())) {
// 文件已更改
}