8

Tôi gặp vấn đề với cả hai FIleObserverContentObserver không hoạt động trong Android Marshmallow. Tôi đang sử dụng điều này để phát hiện những thay đổi xảy ra bên trong một thư mục. Tôi thiết lập thời gian chạy quyền cho marshmallow. Nhưng sau đó nó cũng cho thấy không có sự kiện. Nó hoạt động hoàn hảo trong các phiên bản khác. Làm ơn hãy giúp tôi giải quyết vấn đề này.FIleObserver và ContentObserver không hoạt động trong Android Marshmallow

Trước tiên, tôi đã thử Trình phân giải nội dung bên trong Dịch vụ để phát hiện các thay đổi thư mục trong nền.

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); 
        } 
       } 
     ); 

    } 
} 

Và điều khoản thời gian chạy như:

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); 
    } 
} 

Và nhận rằng quyền dẫn đến onRequestPermissionsResult. Phương pháp này không hiệu quả đối với tôi. Vì vậy, tôi đã thử với FileObserver bên trong dịch vụ đó. Thời gian đó nó cũng hoạt động trong tất cả các nền tảng khác, nhưng không phải là Marshmallow.

Trả lời

3

Điều này dường như là lỗi trong Marshmallow, see here.

Bạn chỉ có thể thử làm việc xung quanh bằng cách bỏ phiếu cho bất kỳ thông tin nào bạn cần.

Điều này sẽ phù hợp với bạn như thế nào tùy thuộc vào trường hợp sử dụng của bạn. Tôi thấy nó có thể sử dụng để theo dõi tiến độ tải xuống: bắt đầu bỏ phiếu khi quá trình tải xuống bắt đầu, với khoảng thời gian một giây và dừng khi quá trình tải xuống hoàn tất.

Nếu bạn mong đợi những thay đổi không thường xuyên, bạn có thể thử tăng khoảng thời gian - với chi phí trễ có khả năng cao hơn giữa các thay đổi xảy ra và ứng dụng của bạn chọn chúng.

Các vấn đề liên quan