2013-10-07 52 views
38

MPMusicPlayerController setVolume是deprecated since iOS 7iOS 7:MPMusicPlayerController卷已棄用。如何現在更改設備音量?

是否有任何其他方式來更改系統音樂音量?最好沒有用戶交互。 其重要功能:自動增加來自AppStore的任何鬧鐘的音量。

+8

我也依賴於此功能,因爲我的用戶希望能夠設置和保存我的應用程序打開的音量。這似乎是一個離開開發者控制的奇怪事情。 – amergin

+1

@amergin同意。 – mark

+0

有AVAudioPlayer:http://stackoverflow.com/questions/5222464/using-mpmediaitems-with-avaudioplayer。我的問題是它是否可以播放iPod庫中的歌曲。 –

回答

50

準確回答你的問題: 是的還有其他方式可以在沒有用戶交互的情況下更改系統體積。

直到最近我以前認爲用編程方式使用MPVolumeView更改音量只能使用私有API。不過我已經證實,這改變volumeSlider的價值和僞造滑塊的觸上事件的工作原理:

MPVolumeView* volumeView = [[MPVolumeView alloc] init]; 

//find the volumeSlider 
UISlider* volumeViewSlider = nil; 
for (UIView *view in [volumeView subviews]){ 
    if ([view.class.description isEqualToString:@"MPVolumeSlider"]){ 
     volumeViewSlider = (UISlider*)view; 
     break; 
    } 
} 

[volumeViewSlider setValue:1.0f animated:YES]; 
[volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside]; 

(當滑塊接收觸上事件,它會調用自身_commitVolumeChange方法,這將改變系統卷)

+1

對不起,我是愚蠢的。我試圖將你的代碼粘貼到我的js函數中。 Dreamweaver會拋出一個紅色的語法箭頭。這是JS代碼還是其他的東西? – Garavani

+1

@Garavani它是一個客觀的C代碼。並不是那麼直接地將它與js結合起來。 請在這裏找到更多的信息在這個教程 - http://www.bignerdranch.com/blog/javascriptcore-example/ – ambientlight

+0

謝謝Hurden! 「不是直截了當」這是否意味着在你的眼睛中,可以通過在iPad上運行iOS 7.1.2的主屏幕上使用的Web應用程序通過JS控制音量?對於初學者來說,這將是很多艱苦的研究。所以也許這會更好,如果有人說:不,沒辦法這樣做。 – Garavani

13

直到蘋果認爲應該撤銷這個決定有兩種補救措施,我已經發現:使用卷屬性

  • 保持,它仍然是iOS版7.0.2
  • 使用AVAudioSession.outputVolume下工作閱讀應用程序喚醒時的音量,如果音量低於(或高於)用戶指定的值,則彈出包含MPVolumeView的警報。至少你的用戶知道他們的警報(或其他)會安靜地播放,並有機會調整音量。或者,您可以非常清楚地顯示音量級別,這樣他們就不會感到驚訝。
+0

只應使用第二個選項> = iOS 7.0。謝謝! :) – Alex

+0

截至iOS 10,你仍然可以使用音量屬性! –

3

@Hurden,我寫了一個斯威夫特代碼來實現MPVolumeSlider:

for view in mpVolumeView.subviews { 
    let uiview: UIView = view as UIView 
    //println("\(uiview.description)") 
    if uiview.description.rangesOfString("MPVolumeSlider").first != nil { 
    mpVolumeSilder = (uiview as UISlider) 
    currentDeviceVolume = mpVolumeSilder!.value 
    return 
    } 
} 

的FUNC rangeOfString擴展字符串可以在這裏找到Swift: A pure Swift method for returning ranges of a String instance (Xcode 6 Beta 5)

,並使用此代碼來讓手勢和mpvolumeslider一起工作

@IBAction func handlePan(recognizer: UIPanGestureRecognizer) { 
    let translation = recognizer.translationInView(self.view) 
    let dx = (translation.x-lastTranslationX) 
    let volumeChanged = Float(dx/mpVolumeView.frame.width) 
    currentDeviceVolume = currentDeviceVolume + Float(volumeChanged) 

    if currentDeviceVolume > 1 { 
    currentDeviceVolume = 1 
    } else if currentDeviceVolume < 0 { 
    currentDeviceVolume = 0 
    } 

    mpVolumeSilder!.value = currentDeviceVolume 

    if recognizer.state == .Changed { 
    lastTranslationX = translation.x 
    } 
    if recognizer.state == .Ended || recognizer.state == .Began { 
    lastTranslationX = 0 
    } 
} 
1

斯威夫特版本:

// Outlet added in Storyboard (Add UIView then set class to MPVolumeView) 
@IBOutlet weak var mpVolumeView: MPVolumeView! 

    // Get volume slider within MPVolumeView 
    for subview in self.mpVolumeView.subviews { 
     if (subview as UIView).description.rangeOfString("MPVolumeSlider") != nil { 
      // Set volume 
      let volumeSlider = subview as UISlider 
      volumeSlider.value = 1 

      // Works with or without the following line: 
      // volumeSlider.sendActionsForControlEvents(UIControlEvents.TouchUpInside) 
      break 
     } 
    } 
8

只是這樣做:

let masterVolumeSlider: MPVolumeView = MPVolumeView() 

if let view = masterVolumeSlider.subviews.first as? UISlider{ 

    view.value = 1.0 

} 
+0

'import MediaPlayer'is also needed – Mike

+0

'masterVolumeSlider.alpha = 0.01; self.view.addSubview(masterVolumeSlider)'也允許我減少它而不顯示操作系統音量計 –

+0

我最喜歡這個答案,因爲它很高雅,不需要使用內部類名。看起來最有可能在未來不會中斷。 –

0

該解決方案有點緊張,我認爲它有點奇怪一個官方的API不存在,但這裏是我的SWIFT解決方案建立在ambientlight的後

var _volumeView = MPVolumeView() 
var _volumeSlider : UISlider? = nil 



self.view.addSubview(_volumeView) 
_volumeView.hidden = true 

var i = 0 
while i < _volumeView.subviews.count { 
    if let _r = _volumeView.subviews[i] as? UISlider { 
     _volumeSlider = _r 
     break 
    } 
    ++i 
} 
0
let masterVolumeSlider : MPVolumeView = MPVolumeView() 

     if let view    = masterVolumeSlider.subviews.first as? UISlider{ 

     view.value    = fVolume! 

     view.sendActionsForControlEvents(UIControlEvents.TouchUpInside) 

     } 
1

顯然有改變系統音量,而完全不任何顯示的方式。

最重要的是它可以在iOS的11

這裏是我是如何實現它:

1)所需的ViewController

let volumeView = MPVolumeView() 
var slider: UISlider? 

2)創建兩個變量下面的代碼添加到您的viewDidLoad

volumeView.alpha = 0.01 
self.view.addSubview(volumeView) 

if let view = volumeView.subviews.first as? UISlider { 
    slider = view 
} 

3)改變當你需要時可以自由運行

slider?.value = 0.4 
相關問題