FIleObserver和ContentObserver无法在Android Marshmallow中运行

我有问题,FIleObserver和ContentObserver都无法在 Android Marshmallow中运行.我正在使用这个东西来检测文件夹内发生的变化.我为marshmallow设置了运行时权限.但在那之后它也没有显示任何事件.它在其他版本中完美运行.请帮我解决这个问题.

首先,我尝试在Service中使用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);
                                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.

解决方法

这似乎是Marshmallow,see here中的一个错误.

您只能通过轮询您需要的任何信息来尝试解决它.

这对你有用的程度取决于你的用例.我发现它可用于跟踪下载进度:下载开始时以一秒的间隔开始轮询,并在下载完成时停止.

如果您预计会发生非常罕见的更改,您可以尝试增加间隔时间 – 代价是更改发生之间可能会有更长的延迟,并且您的应用会将其提取.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...