FileObserver和ContentObserver在Android Marshmallow中无法工作

8
我在使用Android Marshmallow时遇到了关于和的问题。我使用这两个工具来检测文件夹内部的变化。我已经为Marshmallow设置了运行时权限,但仍然没有触发任何事件。在其他版本中这些工具是正常工作的。请帮助我解决这个问题。
起初,我尝试在后台使用服务中的Content Resolver来检测文件夹的变化。
public class TestService extends Service {

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        initial();
        return START_STICKY;
    }

    public void initial(){
        getContentResolver().registerContentObserver(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                true,
                new ContentObserver(new Handler()) {
                    @Override
                    public boolean deliverSelfNotifications() {
                        Log.d("hai", "deliverSelfNotifications");
                        return super.deliverSelfNotifications();
                    }

                    @Override
                    public void onChange(boolean selfChange) {
                        super.onChange(selfChange);
                    }

                    @Override
                    public void onChange(boolean selfChange, Uri uri) {

                        if (uri.toString().matches(MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString() + "/[0-9]+")) {

                            Cursor cursor = null;
                            try {
                                cursor = getContentResolver().query(uri, new String[] {
                                        MediaStore.Images.Media.DISPLAY_NAME,
                                        MediaStore.Images.Media.DATA
                                }, null, null, null);
                                if (cursor != null && cursor.moveToFirst()) {
                                    final String fileName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
                                    final String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                                    // TODO: apply filter on the file name to ensure it's screen shot event
                                    Log.d("file", "FILE CHANGE OCCURED " + fileName + " " + path);
                                }
                            } finally {
                                if (cursor != null)  {
                                    cursor.close();
                                }
                            }
                        }
                        super.onChange(selfChange, uri);
                    }
                }
        );

    }
}

运行时权限包括:

private void getPermission(){
    boolean hasPermission = (ContextCompat.checkSelfPermission(this,
            Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
    if (!hasPermission) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                REQUEST_READ_STORAGE);
    }
}

onRequestPermissionsResult中收到了权限结果。但这个方法对我没用。所以我尝试在服务内使用FileObserver。那时它在所有其他平台上都能工作,但在Marshmallow上不能。

1个回答

3
这似乎是Marshmallow中的一个错误,请参见此处
您只能尝试通过轮询获取所需信息来解决问题。
这将取决于您的使用情况。我发现它可用于跟踪下载进度:在下载开始时以1秒的间隔开始轮询,并在下载完成时停止。
如果您预计更改非常不频繁,可以尝试增加间隔-代价是变化发生和您的应用程序接收到变化之间可能会有更高的延迟。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接