2012-04-10 41 views
8

Tôi đang viết một ứng dụng cần phát hiện khi thẻ SD được gắn dưới dạng ổ đĩa vào máy tính qua USB hoặc khi nó đã được xóa thủ công. Tôi đã thử sử dụng bộ thu phát sóng cho mục đích này, nhưng onReceive không được gọi. Mã của tôi là như sau.Android: Phát hiện khi thẻ SD được gắn dưới ổ đĩa vào máy tính

IntentFilter filter2 = new IntentFilter(); 
     //filter2.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); 
     filter2.addAction(Intent.ACTION_MEDIA_UNMOUNTED); 
     filter2.addAction(Intent.ACTION_MEDIA_SHARED); 
     filter2.addAction(Intent.ACTION_MEDIA_REMOVED); 
     filter2.addAction(Intent.ACTION_MEDIA_MOUNTED); 

     registerReceiver(new CustomBroadcastReceiver(), filter2); 

thu phát sóng của tôi là như sau ...

public class CustomBroadcastReceiver extends BroadcastReceiver{ 

    public CustomBroadcastReceiver(){ 

    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 

     if(action.equals(Intent.ACTION_MEDIA_UNMOUNTED) || action.equals(Intent.ACTION_MEDIA_SHARED) || action.equals(Intent.ACTION_MEDIA_REMOVED)){ 
      HardwareManager.IS_MEDIA_MOUNTED = false; 
     }else if(action.equals(Intent.ACTION_MEDIA_MOUNTED)){ 
      HardwareManager.IS_MEDIA_MOUNTED = true; 
     }else if(action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)){ 
      HardwareManager.IN_AIRPLANE_MODE = intent.getBooleanExtra("state", false); 
     } 
    } 

} 

Phương pháp onReceive không cháy, khi tôi kết nối như một ổ đĩa thông qua USB.

Tôi đang làm gì sai?

Trả lời

11

Bạn phải thêm "tập tin" chương trình (addDataScheme ("file")) để các IntentFilter để phù hợp với phát sóng ACTION_MEDIA_ * ý đồ hành động.

Các ACTION_MEDIA_ * ý đồ có đường dẫn tới điểm lắp trong lĩnh vực Intent.mData (xem Intent docs) nhưng một IntentFilter không có kế hoạch thiết lập sẽ chỉ phù hợp với một ý định nếu nó bao gồm không có dữ liệu (xem IntentFilter docs).

3

Điều này hiện không được hỗ trợ ở cấp SDK.

Nguồn: Android: Detect USB flash drive plugged in

+0

Điều này có thể thực hiện được với NDK của Android không? –

+0

Tôi không biết. Sẽ thông báo cho bạn nếu tôi có bất kỳ gợi ý nào. – Chromium

+0

tôi nghĩ rằng nghe ACTION_UMS_CONNECTED sẽ hoạt động đối với API phiên bản 8 và android.os.storage.StorageEventListener sẽ hoạt động đối với các phiên bản API sau này. –

1

Dường như các ACTION_UMS_CONNECTED không hoạt động. Tôi cần phải làm việc trên API phiên bản 8, do đó bất kỳ android.os.storage.StorageEventListener nào đều không thể áp dụng.

Tôi đã sử dụng câu trả lời được đăng here để cập nhật biến tĩnh trong chuỗi. Điều này cũng có thể được sử dụng để thực hiện một phát sóng tùy chỉnh là tốt. Phương pháp này là như sau ... * Chú ý: HardwareManager là một người dùng định nghĩa lớp

private static class SDCardMountStatusMonitor implements Runnable{ 

    public void run() { 
     // TODO Auto-generated method stub 
     while(true){ 
      try { 
       HardwareManager.IS_MEDIA_MOUNTED = sdIsCardMounted(); //YOU CAN BROADCAST SOMETHING FROM HERE INSTEAD 
       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

public static boolean sdIsCardMounted() { 
     String state = Environment.getExternalStorageState(); 
     if (Environment.MEDIA_MOUNTED.equals(state)) { 
      return true; 
     } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
      return false; 
     } else { 
      return false; 
     } 
} 

Sau đó, ở một nơi khác, tôi tạo ra một chủ đề ra khỏi Runnable này và bắt đầu nó.

Thread t = new Thread(new SDCardMountStatusMonitor()); 
t.start(); 
Các vấn đề liên quan