Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.33 KB | None | 0 0
  1. 需求:用户插入耳机后,APP提示用户耳机已插入,可选择耳机播放或外放模式。用户选择耳机播放,什么都不用做;用户选择外放模式,向系统发送模拟拔出耳机事件
  2. (耳机实际未拔出),声音外放。
  3. 实现:BroadcastReceiver监听耳机插入/拔出事件,在插入时进行处理,通过反射向系统发送模拟拔出事件。
  4.  
  5. private String headsetName;
  6. private int microphone;
  7.  
  8. @Override
  9. public void onReceive(final Context context, Intent intent) {
  10.  
  11. if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
  12. int state = intent.getIntExtra("state", -1);
  13. headsetName = intent.getStringExtra("name");
  14. microphone = intent.getIntExtra("microphone", 0);
  15.  
  16. switch (state) {
  17. case 0:
  18. // 拔出耳机
  19. break;
  20. case 1:
  21. // 插入耳机,进行事件处理...
  22. ...
  23. sendIntent();// 模拟发送事件
  24. break;
  25. }
  26. }
  27. }
  28.  
  29. private void sendIntent() {
  30. Intent intent = new Intent(Intent.ACTION_HEADSET_PLUG);
  31. intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
  32. intent.putExtra("state", 0);
  33. intent.putExtra("name", headsetName);
  34. intent.putExtra("microphone", microphone);
  35.  
  36. Method m;
  37. AudioManager am = ((AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE));
  38. try {
  39. if (Build.VERSION.SDK_INT < 16) {
  40. Class<?> clazz = Class.forName("android.app.ActivityManagerNative");
  41. m = clazz.getMethod("broadcastStickyIntent", Intent.class, String.class);
  42. m.setAccessible(true);
  43. m.invoke(clazz, intent, null);
  44. return;
  45. }
  46. m = am.getClass().getMethod("setWiredDeviceConnectionState", Integer.TYPE, Integer.TYPE, String.class);
  47. m.setAccessible(true);
  48. Object[] objArr = new Object[3];
  49. objArr[0] = (intent.getIntExtra("microphone", 0) == 0) ? 8 : 4;
  50. objArr[1] = intent.getIntExtra("state", 0);
  51. objArr[2] = intent.getStringExtra("name");
  52. m.invoke(am, objArr);
  53. } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
  54. e.printStackTrace();
  55. }
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement