2011-09-26 14 views
5

im tratando de hacer algo similar a esto: android: how to listen to "sd card removed unexpectedly" pero OnReceive del oyente nunca se llamara, cuando no tengo sdcard montada o quito la tarjeta sd. Aquí está el código.oyente para la eliminación sdcard

public class MyClass1 extends Activity{ 
    BroadcastReceiver mSDCardStateChangeListener = null; 
    /** Called when the activity is first created. */ 
    public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    mSDCardStateChangeListener = MyClass2.registerSDCardStateChangeListener(this); 
    //some code which needs SDCard and throws unhandled exception if sdcard is not there 

} 

@Override 
    protected void onDestroy() 
    { 
     MyClass2.unRegisterSDCardStateChangeListener(this, mSDCardStateChangeListener); 
     super.onDestroy(); 
    } 



//in MyClass2 
public static BroadcastReceiver registerSDCardStateChangeListener(Activity act) { 

     BroadcastReceiver mSDCardStateChangeListener = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context arg0, Intent arg1) { 
       String action = arg1.getAction(); 
        if(action.equalsIgnoreCase(Intent.ACTION_MEDIA_REMOVED) 
          || action.equalsIgnoreCase(Intent.ACTION_MEDIA_UNMOUNTED) 
          || action.equalsIgnoreCase(Intent.ACTION_MEDIA_BAD_REMOVAL) 
          || action.equalsIgnoreCase(Intent.ACTION_MEDIA_EJECT)) 
        { 
         //i never come here ;(
        //do something 

        } 

      } 
     }; 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_MEDIA_REMOVED); 
     filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); 
     filter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL); 
     filter.addAction(Intent.ACTION_MEDIA_EJECT); 
     filter.addDataScheme("file"); 
     act.registerReceiver(mSDCardStateChangeListener, filter); 
     return mSDCardStateChangeListener; 
} 

public static void unRegisterSDCardStateChangeListener(Activity act, BroadcastReceiver mSDCardStateChangeListener) 
    { 
     act.unregisterReceiver(mSDCardStateChangeListener); 
    } 

no quiero para comprobar si la tarjeta sd está presente o no por si (android.os.Environment.getExternalStorageState(). Equals (android.os.Environment.MEDIA_MOUNTED)) pero usar el receptor en su lugar. Cualquier ayuda es bienvenida. ¡Gracias !.

+0

¿estableciste tus permisos en el archivo de manifiesto? – Lukap

+0

@Lukap tengo android.permission.READ_PHONE_STATE en mi manifiesto –

+0

@ con_9 Tienes razón, lo siento. – Caner

Respuesta

3

Ok, creo que el código que publiqué está destinado para la acción &, no el estado & funciona bien.

de documentación:

Acción android.content.Intent.ACTION_MEDIA_REMOVED Difusión: los medios de comunicación externa se ha eliminado. La ruta al punto de montaje para los medios eliminados se encuentra en el campo Intent.mData .

así que lo que esperaba (yo estaba equivocado, ver las dos primeras líneas de la pregunta) que si no tengo tarjeta SD (es decir, que se ha eliminado anteriormente) y luego lanzar la aplicación que tendría la llamada lo que implica que no tengo la tarjeta SD (sé que suena estúpido;)). El intento son acciones (y no estado). Así que si elimino la tarjeta SD mientras la aplicación está activa, sí recibo la devolución de llamada. Gracias por su tiempo Vegas.

Cuestiones relacionadas