2013-12-20 68 views
0

我有一个三星Galaxy S3(目前不安全),我有时会遇到问题,例如,如果我插入耳机听FM收音机,突然关闭应用程序并断开耳机,手机仍然相信有一个插入,所以声音(扬声器和麦克风)是路由到耳机插孔,所以当我想与某人交谈时,没有声音。MediaRoute和路由音频

我不知道我解释得好。

我希望有一种方法可以在单击按钮时将声音指向正常状态(扬声器和麦克风)。我研究了一些东西,但是我什么也没得到我认为这段代码是正确的,但我需要一些帮助和建议。

这是我的代码:

public void route(Context context){ 
     String outputDeviceName, outputDeviceName2; 
     try { 
      MediaRouter media_route = (MediaRouter)getBaseContext().getSystemService(Context.MEDIA_ROUTER_SERVICE); 
      Class mediaRouterClass = Class.forName("android.media.MediaRouter"); 
      Method getSystemAudioRouteMethod = mediaRouterClass.getMethod("getSystemAudioRoute"); 
      RouteInfo route_info = (RouteInfo)getSystemAudioRouteMethod.invoke(media_route); 

      Class mediaRouterStaticClass = Class.forName("android.media.MediaRouter$Static"); 
      Field staticField = mediaRouterClass.getDeclaredField("sStatic"); 

      Field[] array = mediaRouterStaticClass.getDeclaredFields(); 
      for(Field one: array){ 
       Log.i("CLASS_FIELD", "" + one.getName().toString()); 
      } 
      Field normalOutputField = mediaRouterStaticClass.getDeclaredField("mSelectedRoute"); 
      AccessibleObject.setAccessible(new AccessibleObject[]{staticField}, true); 
      AccessibleObject.setAccessible(new AccessibleObject[]{normalOutputField}, true); 
      Object speakerRoute = normalOutputField.get(staticField.get(null)); 
      if (speakerRoute != media_route.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_AUDIO)) { 
       // Phone, Headphone, HDMI, etc.. 
       outputDeviceName = "name: " + route_info.getName().toString(); 
       media_route.selectRoute(MediaRouter.ROUTE_TYPE_LIVE_AUDIO, route_info); 
       media_route. 
       outputDeviceName2 = "name: " + route_info.getName().toString(); 
      } else { 
       // Audio is routed to A2DP 
       outputDeviceName = "name: A2DP"; 
       outputDeviceName2 = "name: " + route_info.getName().toString(); 
      } 
      Log.i("outputDeviceName", ""+ outputDeviceName); 
      Log.i("outputDeviceName2", ""+ outputDeviceName2); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

我能做些什么来路由输出声音?

+0

应用程序无法告诉系统耳机已被分离。如果系统认为耳机仍然连接,那么您的运气不好。你可以尝试重新附加它,然后再次分离它,看看是否有帮助。 – Michael

+0

这根本不是真的。前一段时间,我为Gingerbread(重定向输出)做了一个类似的应用程序,但在Jelly Bean中这样做的方法有变化,所以旧的不再有效。 :( 我认为这是做同样的方式:( – MAOL

+0

嗯,我认为一个应用程序不能告诉音频HAL(这是做路由决定的地方)一个耳机已被分离。有些方法可以告诉它,例如您希望将某些类型的音频路由到扬声器,即使连接了耳机(这可能是您正在考虑的),但开始变得棘手或甚至不可能(特别是对于输入),如果你想覆盖所有的应用程序和所有可能的用例,或者你正在考虑现在已经废弃的'setRouting'方法吗? – Michael

回答

2

我只有一个评论,但我必须有50个评论的声望。

问题是,当耳机插入时可以将声音传送到听筒和扬声器。 您可以在Play商店中查看应用程序Klick。他们使用一个按钮点击你安装到headjack,即使系统认为他有一个耳机插入插孔,你可以听到电话听起来像没有耳机。

我知道如何将按钮/耳机插入插孔时将声音传送到扬声器。

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
am.setSpeakerphoneOn(true); 

,但我不知道他们是如何航线声音在同一conditions.I听筒一直在试图找出在过去的一周。

到目前为止没有运气,如果您有任何人在此期间找到了解决方案,请将其发布。

底线是它是可能的,并且该应用程序证明它。

+0

经过一些更多的研究后,即使耳机/耳机/或点击式插头插入插孔时,我仍设法将声音重新路由至扬声器。 –

+0

编辑我的上面的答案是一个窗格,我不断收到格式错误,我不能花一整天的时间来理解问题。 –

+0

感谢您的时间Mihai – MAOL