Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 需求:用户插入耳机后,APP提示用户耳机已插入,可选择耳机播放或外放模式。用户选择耳机播放,什么都不用做;用户选择外放模式,向系统发送模拟拔出耳机事件
- (耳机实际未拔出),声音外放。
- 实现:BroadcastReceiver监听耳机插入/拔出事件,在插入时进行处理,通过反射向系统发送模拟拔出事件。
- private String headsetName;
- private int microphone;
- @Override
- public void onReceive(final Context context, Intent intent) {
- if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
- int state = intent.getIntExtra("state", -1);
- headsetName = intent.getStringExtra("name");
- microphone = intent.getIntExtra("microphone", 0);
- switch (state) {
- case 0:
- // 拔出耳机
- break;
- case 1:
- // 插入耳机,进行事件处理...
- ...
- sendIntent();// 模拟发送事件
- break;
- }
- }
- }
- private void sendIntent() {
- Intent intent = new Intent(Intent.ACTION_HEADSET_PLUG);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- intent.putExtra("state", 0);
- intent.putExtra("name", headsetName);
- intent.putExtra("microphone", microphone);
- Method m;
- AudioManager am = ((AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE));
- try {
- if (Build.VERSION.SDK_INT < 16) {
- Class<?> clazz = Class.forName("android.app.ActivityManagerNative");
- m = clazz.getMethod("broadcastStickyIntent", Intent.class, String.class);
- m.setAccessible(true);
- m.invoke(clazz, intent, null);
- return;
- }
- m = am.getClass().getMethod("setWiredDeviceConnectionState", Integer.TYPE, Integer.TYPE, String.class);
- m.setAccessible(true);
- Object[] objArr = new Object[3];
- objArr[0] = (intent.getIntExtra("microphone", 0) == 0) ? 8 : 4;
- objArr[1] = intent.getIntExtra("state", 0);
- objArr[2] = intent.getStringExtra("name");
- m.invoke(am, objArr);
- } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
- e.printStackTrace();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement