2012-04-10 14 views
8

Sto scrivendo un'applicazione che deve rilevare quando la scheda SD è montata come unità disco su un computer tramite USB o quando è stata rimossa manualmente. Ho provato a utilizzare un ricevitore di trasmissione per questo scopo, ma l'onReceive non viene chiamato. Il mio codice è il seguente.Android: Rileva quando la scheda SD è montata come unità disco su un computer

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

mio ricevitore di trasmissione è il seguente ...

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

} 

Il metodo OnReceive non si attiva quando si collega come unità disco tramite USB.

Cosa sto sbagliando?

risposta

11

si deve aggiungere il sistema di "file" (addDataScheme ("file")) in modo che l'IntentFilter per abbinare la trasmissione ACTION_MEDIA_ * intenti azione.

L'ACTION_MEDIA_ * intenti hanno il percorso del punto di montaggio nel campo Intent.mData (vedi Intent docs), ma un IntentFilter senza schemi stabiliti corrisponderà solo un intento se non include i dati (vedi IntentFilter docs).

3

Attualmente non è supportato a livello di SDK.

Fonte: Android: Detect USB flash drive plugged in

+0

Ciò sarebbe possibile con l'NDK di Android? –

+0

Non lo so. Ti informerò se ho qualche suggerimento. – Chromium

+0

penso che l'ascolto di ACTION_UMS_CONNECTED funzionerà per l'API versione 8 e android.os.storage.StorageEventListener funzionerà per le versioni successive dell'API. Correzioni –

1

Apparentemente l'ACTION_UMS_CONNECTED non funziona. Ho bisogno di lavorare su API versione 8, quindi qualsiasi android.os.storage.StorageEventListener non è applicabile.

Ho usato la risposta pubblicata here per aggiornare una variabile statica in una discussione. Questo può anche essere usato per eseguire anche una trasmissione personalizzata. Il metodo è il seguente ... * NOTA: HardwareManager è un utente classe definita

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

Poi, in un altro luogo, creo un filo fuori da questo Runnable e avviarlo.

Thread t = new Thread(new SDCardMountStatusMonitor()); 
t.start(); 
Problemi correlati