2011-06-09 44 views
7

我想注册一个接收器,以删除SD卡,但我的接收器没有得到调用删除粘贴我的代码在这里的SD卡。我在oncreate()中注册接收器,并在ondestroy函数中取消注册。请让我知道如果我犯了什么错误。没有得到SD卡相关的意图,我的广播接收器

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

如果我的代码中有任何错误,请让我知道。

回答

24

尝试增加给你的意图过滤

filter.addDataScheme("file"); 

您似乎在试图赶上发送路径为意图的数据字段的行动。如果是这种情况,那么你的意图过滤器必须有匹配的方案。

最后,这只是一个建议,但我建议您在Intent类中使用常量,而不是手动输入操作。 IE,使用Intent.ACTION_MEDIA_REMOVED而不是直接使用字符串。

+0

非常感谢,它的工作 – Suman 2011-06-09 14:16:51

+0

@Justin Breitfeller +1为您的答案。 – 2013-04-26 10:15:28

3

贾斯汀Breitfeller的回答为我工作,但作为一种替代技术,你也可以做到这一点完全在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> 

然后使接收器正确的类:

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

我已经找到解决方案,而应用程序正在运行和用户卸载/删除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); 
} 

在类,定义方法如下面,

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

希望这将是有帮助的。