5

Ứng dụng của tôi xử lý hình ảnh, tôi có thể xử lý hình ảnh đã lưu trữ trong thiết bị Android. Tôi cũng muốn xử lý hình ảnh mới. có bất kỳ người nghe nào sẽ thông báo cho tôi khi có ảnh mới đến thư viện không? Tôi đã tìm kiếm hai ngày. Tôi không thể có được thứ gì chắc chắn.Cách nghe ảnh mới trong android?

Tôi đã đọc khoảng FileObserver, nó có giúp tôi nghe cả người dùng tải xuống hình ảnh hoặc chụp ảnh mới bằng máy ảnh không?

Trả lời

7

ảnh mới đến với phòng trưng bày

có nghĩa là nó đã được bổ sung vào MediaStore.

Trước hết, FileOberver là phương pháp tiếp cận trí nhớ. Hãy xem xét một khối lượng lớn các tập tin. Thay vào đó, ContentObserver có vẻ là một cách tiếp cận tốt hơn nhiều.

getContentResolver().registerContentObserver(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, true, 
     new ContentObserver(new Handler()) { 
      @Override 
      public void onChange(boolean selfChange) { 
       Log.d("your_tag","Internal Media has been changed"); 
       super.onChange(selfChange); 
       Long timestamp = readLastDateFromMediaStore(context, MediaStore.Images.Media.INTERNAL_CONTENT_URI); 
       // comapare with your stored last value and do what you need to do 

      } 
     } 
    ); 
getContentResolver().registerContentObserver(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, 
    new ContentObserver(new Handler()) { 
     @Override 
     public void onChange(boolean selfChange) { 
      Log.d("your_tag","External Media has been changed"); 
      super.onChange(selfChange); 

      Long timestamp = readLastDateFromMediaStore(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      // comapare with your stored last value and do what you need to do 
     } 
    } 
); 

private Long readLastDateFromMediaStore(Context context, Uri uri) { 
     Cursor cursor = context.getContentResolver().query(uri, null, null, null, "date_added DESC"); 
     PhotoHolder media = null; 
     Long dateAdded =-1; 
     if (cursor.moveToNext()) { 
      Long dateAdded = cursor.getLong(cursor.getColumnIndexOrThrow(MediaColumns.DATE_ADDED));   
     } 
     cursor.close(); 
     return dateAdded; 
} 

Có thể là một ý tưởng hay khi làm điều này trong một dịch vụ (bao giờ hết)! Bạn cũng cần phải hủy đăng ký trong số onDestroy()

Cảnh báo: Điều này chỉ cho bạn biết khi nào MediaStore đã được thay đổi, nó không cho biết bất kỳ điều gì cụ thể về việc thêm/xóa. Đối với điều này, bạn có thể phải truy vấn MediaStore để phát hiện bất kỳ thay đổi nào từ cơ sở dữ liệu trước đó của bạn hoặc một cái gì đó.

+0

Vì vậy, bạn đề xuất rằng chúng tôi nên tạo cơ sở dữ liệu làm so sánh, vì vậy chúng tôi có thể phát hiện thêm hoặc xóa? Không phải là nó quá quá mức? New ContentObserver android có 'public void onChange (boolean selfChange, Uri uri)' bạn có nghĩ chúng ta có thể sử dụng nó để phát hiện thêm/xóa không? – HendraWD

+0

1.Có, chúng tôi sẽ cần cơ sở dữ liệu riêng của chúng tôi sau đó. 2. Không có nó quá nhiều. Hãy để tôi giải thích, bạn nên có thông tin về thời gian bạn đã kiểm tra lần cuối. Vì vậy, khi bạn đang truy vấn, bạn cần phải cập nhật cơ sở dữ liệu của bạn tối đa ngày giờ đó. 3. Điều này onChange() có thể hữu ích, nhưng tuy nhiên tôi đã không sử dụng nó vì vậy không thể chắc chắn. Tài liệu nói - Để đảm bảo hoạt động chính xác trên các phiên bản cũ của khung không cung cấp đối số Uri, các ứng dụng cũng nên thực hiện quá tải onChange (boolean) của phương thức này bất cứ khi nào chúng thực hiện quá tải onChange (boolean, Uri). –

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