<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                除了通過音量鍵可以調節音量以外,用戶還可以在系統設置中進行調節。AudioManager.setStreamVolume()是系統設置界面中調整音量所使用的接口。 #### 1. setStreamVolume()分析 setStreamVolume()是SDK中提供給應用的API,它的作用是為特定的流類型設置范圍內允許的任意音量。我們看一下它的實現: **AudioService.java-->AudioService.setStreamVolume()** ``` public void setStreamVolume(int streamType, intindex, int flags) { // 這里先判斷一下流類型這個參數的有效性 ensureValidStreamType(streamType); // 獲取保存了指定流類型音量信息的VolumeStreamState對象。 // 注意這里面使用mStreamVolumeAlias對這個數組進行了流類型的轉換 VolumeStreamState streamState =mStreamStates[mStreamVolumeAlias[streamType]]; // 獲取當前流將使用哪一個音頻設備進行播放。它最終會調用到AudioPolicyService里去 final intdevice = getDeviceForStream(streamType); // 獲取流當前的音量 final intoldIndex = streamState.getIndex(device, (streamState.muteCount()!= 0) /* lastAudible */); // 將原流類型下的音量值映射到目標流類型下的音量值 // 因為不同流類型的音量值刻度不一樣,所以需要進行這個轉換 index =rescaleIndex(index * 10, streamType, mStreamVolumeAlias[streamType]); //暫時先忽略下面這段if中的代碼。它的作用根據flags的要求修改手機的情景模式 if(((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) || (mStreamVolumeAlias[streamType] == getMasterStreamType())) { …… } // 調用setStreamVolumeInt() setStreamVolumeInt(mStreamVolumeAlias[streamType], index, device, false,true); // 獲取設置的結果 index =mStreamStates[streamType].getIndex(device, (mStreamStates[streamType].muteCount() != 0) /*lastAudible */); // 廣播通知 sendVolumeUpdate(streamType, oldIndex, index, flags); } ``` 看明白這個函數了嗎?拋開被忽略掉的那個if塊歸納一下:它的工作其實很簡單的,就是執行下面這三方面的工作: - 為調用setStreamVolumeInt準備參數。 - 調用setStreamVolumeInt。 - 廣播音量發生變化的通知。 分析的主線將轉向setStreamVolumeInt()的內容了。 #### 2. setStreamVolumeInt()分析 看一下setStreamVolumeInt函數的代碼,和往常一樣,暫時忽略目前與分析目標無關的部分代碼。 **AudioService.java-->AudioService.setStreamVolumeInt()** ``` private void setStreamVolumeInt(int streamType, int index, int device, boolean force, booleanlastAudible) { // 獲取保存音量信息的VolumeStreamState對象 VolumeStreamState streamState = mStreamStates[streamType]; if(streamState.muteCount() != 0) { // 這里的內容是為了處理當流已經被靜音后的情況。我們在討論靜音的實現時在考慮這段代碼 …… } else { // 調用streamState.setIndex() if(streamState.setIndex(index, device, lastAudible) || force) { // 如果setIndex返回true或者force參數為true的話就在這里給mAudioHandler // sendMsg(mAudioHandler, MSG_SET_DEVICE_VOLUME, SENDMSG_QUEUE, device, 0, streamState, 0); } } } ``` 此函數有兩個工作,一個是streamState.setIndex() 另一個則是根據setIndex()的返回值和force參數決定是否要發送MSG\_SET\_DEVICE\_VOLUME消息。這兩個內容在3.2.1節中已經又介紹了。在此不再贅述。 其執行過程可以參考下面的序列圖: :-: ![](http://img.blog.csdn.net/20150811133041805?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 圖 3?3setStreamVolume的處理流程 **注意** 看到這個序列圖后,是否有讀者感到眼熟呢?如果我們把setStreamVolumeInt()的內容替換掉在setStreamVolume()的對它的調用,再和adjustStreamVolume()函數進行以下比較,就會發現他們的內容出奇地相似。Android在其他地方也有這樣的情況出現。從這一點上來說,已經發展到4.1版本的Android源碼仍然尚不夠精致。讀者可以思考一下,有沒有辦法把這兩個函數融合為一個函數呢? 到此,對于音量設置相關的內容就告一段落。接下來我們將討論和音量相關的另一個重要的內容——靜音。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看