2013-12-20 65 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