为 Android 上的媒体 Mounted/Removed 事件动态创建接收器
Dynamically created receiver for Media Mounted/Removed events on Android
虽然 activity 是可见的,但我希望在设备安装或移除媒体时通知它。不幸的是,我无法收到这些通知。我唯一能得到的是 foo!
,这是我创建的一个简单测试。
public class MyActivity extends AppCompatActivity {
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.e(ActivityFamily.class.getName(), intent.getAction());
}
};
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction("foo!");
filter.addAction(Intent.ACTION_MEDIA_EJECT);
filter.addAction(Intent.ACTION_MEDIA_REMOVED);
filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
filter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
registerReceiver(receiver, filter);
// just added this as a test for "foo!" action
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
manager.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 2000, PendingIntent.getBroadcast(this, 0, new Intent().setAction("foo!"), 0));
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver);
}
}
为什么当我从设备中删除媒体时 onReceive
没有被调用?
我什至尝试创建一个全新的 MyReceiver.java
并在 AndroidManifest.xml
中定义它,但这也没有用。
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_EJECT" />
<action android:name="android.intent.action.MEDIA_REMOVED" />
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_BAD_REMOVAL" />
<data android:scheme="file" />
</intent-filter>
</receiver>
I found the answer here. 我需要将 file:
方案添加到 intent 过滤器中。
在使用 registerReceiver
之前添加 filter.addDataScheme("file");
对于在清单中注册的静态广播接收器,在 <intent-filter>
.
中添加 <data android:scheme="file" />
虽然 activity 是可见的,但我希望在设备安装或移除媒体时通知它。不幸的是,我无法收到这些通知。我唯一能得到的是 foo!
,这是我创建的一个简单测试。
public class MyActivity extends AppCompatActivity {
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.e(ActivityFamily.class.getName(), intent.getAction());
}
};
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction("foo!");
filter.addAction(Intent.ACTION_MEDIA_EJECT);
filter.addAction(Intent.ACTION_MEDIA_REMOVED);
filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
filter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
registerReceiver(receiver, filter);
// just added this as a test for "foo!" action
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
manager.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 2000, PendingIntent.getBroadcast(this, 0, new Intent().setAction("foo!"), 0));
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver);
}
}
为什么当我从设备中删除媒体时 onReceive
没有被调用?
我什至尝试创建一个全新的 MyReceiver.java
并在 AndroidManifest.xml
中定义它,但这也没有用。
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_EJECT" />
<action android:name="android.intent.action.MEDIA_REMOVED" />
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_BAD_REMOVAL" />
<data android:scheme="file" />
</intent-filter>
</receiver>
I found the answer here. 我需要将 file:
方案添加到 intent 过滤器中。
在使用 registerReceiver
之前添加 filter.addDataScheme("file");
对于在清单中注册的静态广播接收器,在 <intent-filter>
.
<data android:scheme="file" />