Android 未将SD卡相关意图发送到广播接收器

Android 未将SD卡相关意图发送到广播接收器,android,sd-card,Android,Sd Card,我正试图注册一个接收器以移除sd卡,但我的接收器在移除sd卡时没有被调用,并在此处粘贴我的代码。我正在oncreate()中注册接收器,并在ondestroy函数中注销。如果我做错了,请告诉我 void registerSDCardStateChangeListener() { final String MEDIA_REMOVED = "android.intent.action.MEDIA_REMOVED"; final String MEDIA_UNMOUNTED = "an

我正试图注册一个接收器以移除sd卡,但我的接收器在移除sd卡时没有被调用,并在此处粘贴我的代码。我正在oncreate()中注册接收器,并在ondestroy函数中注销。如果我做错了,请告诉我

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

如果我的代码中有任何错误,请告诉我。

尝试将其添加到您的意图过滤器中

filter.addDataScheme("file");
它显示您试图捕获的操作将路径作为意图的数据字段发送。如果是这种情况,那么您的意图过滤器必须具有匹配方案


最后,这只是一个建议,但我建议您使用Intent类中的常量,而不是手动键入操作。例如,使用Intent.ACTION\u MEDIA\u REMOVED,而不是直接使用字符串。

Justin 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>

在应用程序运行和用户卸载/删除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
        }
    }
};

希望对您有所帮助。

@Justin Breitfeller+1,谢谢您的回答。
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
        }
    }
};