2011-06-09 11 views
7

Estoy tratando de registrar un receptor para la eliminación de la tarjeta sd, pero mi receptor no recibe una llamada al quitar la tarjeta sd pegando mi código aquí. Estoy registrando el receptor en oncreate() y anulando el registro en la función ondestroy. Por favor, avíseme si estoy cometiendo algún error.No obtengo las intenciones relacionadas con la tarjeta SD en mi receptor de difusión

void registerSDCardStateChangeListener() { 
    final String MEDIA_REMOVED = "android.intent.action.MEDIA_REMOVED"; 
    final String MEDIA_UNMOUNTED = "android.intent.action.MEDIA_UNMOUNTED"; 
    final String MEDIA_BAD_REMOVAL = "android.intent.action.MEDIA_BAD_REMOVAL"; 
    //  final String MEDIA_EJECT = "android.intent.action.MEDIA_EJECT"; 
    final String MEDIA_EJECT = "android.intent.action.MEDIA_SCANNER_FINISHED"; 

    mSDCardStateChangeListener = new BroadcastReceiver() { 

     @ 
     Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (action.equalsIgnoreCase(MEDIA_REMOVED) || action.equalsIgnoreCase(MEDIA_UNMOUNTED) || action.equalsIgnoreCase(MEDIA_BAD_REMOVAL) || action.equalsIgnoreCase(MEDIA_EJECT)) { 
       if (mMediaPlayer != null) { 
        stopPlayBack(); 
       } 
      } 
     } 
    }; 

    IntentFilter filter = new IntentFilter(); 
    filter.addAction(MEDIA_REMOVED); 
    filter.addAction(MEDIA_UNMOUNTED); 
    filter.addAction(MEDIA_BAD_REMOVAL); 
    filter.addAction(MEDIA_EJECT); 
    registerReceiver(mSDCardStateChangeListener, filter); 
} 

Por favor, hágamelo saber si algo está mal en mi código.

Respuesta

24

Trate de añadir esto a su intención de filtro

filter.addDataScheme("file"); 

Parece que las acciones que está tratando de ponerse al enviar el camino que el campo de datos de la intención. Si ese es el caso, entonces su filtro de intención debe tener el esquema correspondiente.

Finalmente, y esto es sólo una sugerencia, pero le recomendaría que use las constantes en la clase Intención en lugar de escribir sus acciones manualmente. IE, usa Intent.ACTION_MEDIA_REMOVED en lugar de usar la cadena directamente.

+0

Muchas gracias, funcionó – Suman

+0

@Justin Breitfeller +1 por su respuesta. –

3

respuesta de Justin Breitfeller trabajó para mí, sino como una técnica alternativa, también se puede hacer esto en su totalidad en el AndroidManifest.xml:

<receiver android:enabled="true" android:exported="false" 
    android:name="SDCardStateChangeListener"> 
    <intent-filter> 
    <action android:name="android.intent.action.MEDIA_UNMOUNTED" /> 
    <action android:name="android.intent.action.MEDIA_REMOVED" /> 
    <action android:name="android.intent.action.MEDIA_EJECT" /> 
    <action android:name="android.intent.action.MEDIA_BAD_REMOVAL" /> 
    <data android:scheme="file" /> 
    </intent-filter> 
</receiver> 

luego hacer el receptor de una clase adecuada:

public class OnMediaMountedReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.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)) { 
      if(mMediaPlayer != null) { 
       stopPlayBack(); 
      } 
     }    
    } 
}; 
0

He encontrado soluciones mientras se ejecuta la aplicación y el usuario desmonta/retira la tarjeta SD.

@Override 
protected void onResume() { 
    super.onStart(); 

    IntentFilter ejectFilter = new ntentFilter(Intent.ACTION_MEDIA_MOUNTED); 
    ejectFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); 
    ejectFilter.addAction(Intent.ACTION_MEDIA_EJECT); 
    ejectFilter.addDataScheme("file"); 
    registerReceiver(ejectReceiver, ejectFilter); 

} 

@Override 
protected void onPause() { 
    super.onPause(); 

    unregisterReceiver(ejectReceiver); 
} 

En la clase, defina Método como el de abajo,

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

     if (action.equals(Intent.ACTION_MEDIA_EJECT) || action.equals(Intent.ACTION_MEDIA_UNMOUNTED)) 
     { 
      Log.e("msg","Media Unmounted"); 

      //do something on unmounted sdcard from device 
     } 
    } 
}; 

Esperamos que sea útil.

Cuestiones relacionadas