2011-09-01 20 views
20

Cách cấu trúc ứng dụng Android để bắt đầu Service để sử dụng FileObserver để khi thư mục được quan sát được sửa đổi (tức là người dùng chụp ảnh) một số mã khác thực thi. Khi gỡ lỗi, phương thức onEvent sẽ không bao giờ được kích hoạt.Làm cách nào để bạn triển khai FileObserver từ Dịch vụ Android

Đây là sự kiện onStart mà tôi có trong Dịch vụ của mình. Các Toast cháy cho "Dịch vụ của tôi Bắt đầu ..."

public final String TAG = "DEBUG"; 
public static FileObserver observer;  

@Override 
public void onStart(Intent intent, int startid) {  
     Log.d(TAG, "onStart"); 

     final String pathToWatch = android.os.Environment.getExternalStorageDirectory().toString() + "/DCIM/Camera/";  
     Toast.makeText(this, "My Service Started and trying to watch " + pathToWatch, Toast.LENGTH_LONG).show(); 

     observer = new FileObserver(pathToWatch) { // set up a file observer to watch this directory on sd card 
      @Override 
      public void onEvent(int event, String file) { 
       //if(event == FileObserver.CREATE && !file.equals(".probe")){ // check if its a "create" and not equal to .probe because thats created every time camera is launched 
        Log.d(TAG, "File created [" + pathToWatch + file + "]"); 

        Toast.makeText(getBaseContext(), file + " was saved!", Toast.LENGTH_LONG);     
       //} 
      } 
     }; 
    } 

Nhưng sau Toast rằng, nếu tôi chụp ảnh các onEvent không bao giờ cháy. Điều này được xác định bằng cách gỡ lỗi. Nó không bao giờ chạm vào điểm ngắt đó và Toast không bao giờ bắn.

Khi thư mục đó được duyệt, hình ảnh mới sẽ được lưu ở đó.

Làm thế nào để bạn nhận được FileObserver làm việc trong một Service?

Trả lời

43

Vui lòng see bài đăng này. Tôi nghĩ bạn đang bỏ lỡ cuộc gọi observer.startWatching() sau khi thiết lập người quan sát của mình.

observer = new FileObserver(pathToWatch) { // set up a file observer to watch this directory on sd card 

    @Override 
    public void onEvent(int event, String file) { 
     //if(event == FileObserver.CREATE && !file.equals(".probe")){ // check if its a "create" and not equal to .probe because thats created every time camera is launched 
     Log.d(TAG, "File created [" + pathToWatch + file + "]"); 

     Toast.makeText(getBaseContext(), file + " was saved!", Toast.LENGTH_LONG).show(); 
     //} 
    } 
}; 
observer.startWatching(); //START OBSERVING 
+4

tôi sẽ cung cấp cho bạn tín dụng cho câu trả lời vì đó có thể giải quyết nó dựa trên mã mẫu của tôi. Tôi thực sự ghép lại với nhau giải pháp của tôi từ bài viết mà bạn tham khảo nhưng nó vẫn không hoạt động. Tôi có thể đã bỏ lỡ phương thức startWatching(), nhưng một trong hai cách giải pháp cho tôi là sử dụng ví dụ này: http://www.roman10.net/?p=457 – shanabus

8

Thêm .show() sau toast, ví dụ:

Toast.makeText(getBaseContext(), file + " was saved!", toast.LENGTH_LONG).show();     
+0

vâng, chủ sở hữu câu trả lời phải đã chỉnh sửa nó .. – HendraWD

3

Một điều nữa FileObserver không quan sát thư mục phụ. Nếu bạn muốn quan sát các thư mục con quá Kiểm tra this bài đăng.

Một mã nguồn mở RecursiveFileObserver hoạt động như tiên tiến FileObserver đó là đệ quy cho tất cả các thư mục bên dưới thư mục mà bạn đã chọn

Click to download file

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt nhất là đưa các phần quan trọng của câu trả lời vào đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/10535638) – Trilarion

+0

Trang được liên kết là câu trả lời chồng ngược .. vì vậy không cần –

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