没有得到SD卡相关的意图我的广播接收机

我正在尝试注册一个删除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); } 

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

Solutions Collecting From Web of "没有得到SD卡相关的意图我的广播接收机"

尝试添加到您的意图filter

 filter.addDataScheme("file"); 

它似乎是您试图捕获的行为发送path作为意图的数据字段。 如果是这样,那么你的意图filter必须有匹配的scheme。

最后,这只是一个build议,但我会build议您在Intent类中使用常量,而不是手动input您的操作。 IE,使用Intent.ACTION_MEDIA_REMOVED而不是直接使用string。

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> 

然后让接收器成为一个适当的类:

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

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

希望这会有帮助。