8

FIleObserverContentObserverの両方が Android 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、そのサービス内で試してみました。その時も他のすべてのプラットフォームで動作しますが、マシュマロでは動作しません.

4

1 に答える 1

3

これは Marshmallow のバグのようです。こちら を参照してください

必要な情報をポーリングすることによってのみ、この問題を回避することができます。

これがどれだけうまく機能するかは、ユースケースによって異なります。ダウンロードの進行状況を追跡するのに使用できることがわかりました。ダウンロードが開始されたら、1 秒間隔でポーリングを開始し、ダウンロードが終了すると停止します。

変更の頻度が非常に低いと予想される場合は、間隔を長くしてみてください。ただし、変更が発生してからアプリが変更を取得するまでの遅延が大きくなる可能性があります。

于 2016-06-14T20:25:54.953 に答える