8

FIleObserverContentObserverはAndroid Marshmallowで動作しません。私はこのことをフォルダ内で起こっている変化を検出するために使用しています。私は、マシュマロのための実行時許可を設定しました。しかし、それ以降もイベントは発生しません。それは他のバージョンでも完全に機能します。この問題を解決するために私を助けてください。Android MarshmallowでFIleObserverとContentObserverが動作しない

まず、バックグラウンドでフォルダの変更を検出するために、サービス内で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そのサービスの中で試してみました。その時、それは他のすべてのプラットフォームでも動作しますが、マシュマロでは動作しません。

答えて

3

これはMarshmallowのバグのようです。see here

あなたは必要な情報をポーリングするだけで回避できます。

これはあなたのユースケースによって異なります。私はそれがダウンロードの進捗を追跡するために使用可能であることを発見しました。ダウンロード開始時にポーリングを開始し、1秒間隔でダウンロードを開始し、ダウンロードが終了すると停止します。

非常にまれな変更が予定されている場合は、間隔の増加を試みることができます - 変更が発生してからアプリがそれを選択するまでに遅延が生じる可能性があります。

関連する問題