Android 未将SD卡相关意图发送到广播接收器
我正试图注册一个接收器以移除sd卡,但我的接收器在移除sd卡时没有被调用,并在此处粘贴我的代码。我正在oncreate()中注册接收器,并在ondestroy函数中注销。如果我做错了,请告诉我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
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
}
}
};