簡體   English   中英

如何在iOS上更改設備音量 - 而不是音樂音量

[英]How to change device Volume on iOS - not music volume

我想在iOS(iphone)上更改設備音量。

我知道我可以通過以下這些方式改變音樂庫的音量:

//implement at first MediaPlayer framework
MPMusicPlayerController *musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
musicPlayer.volume = 1;

但這不是我的目標。
我想更改設備音量或者讓我說一下鈴聲的音量。

我怎樣才能做到這一點? 只是更改DEVICE卷?

要回答brush51的問題:

我怎樣才能做到這一點? 只是更改DEVICE卷?

正如0x7fffffff建議:

您無法以編程方式更改設備卷,但MPVolumeView(音量滑塊)可用於更改設備音量,但僅通過用戶交互。

所以,Apple建議使用MPVolumeView ,所以我想出了這個:

添加volumeSlider屬性:

@property (nonatomic, strong) UISlider *volumeSlider;

初始化MPVolumeView並在視圖中添加某個地方(由於showsRouteButton = NOshowsVolumeSlider = NO ,可以隱藏,無框架或為空):

MPVolumeView *volumeView = [MPVolumeView new];
volumeView.showsRouteButton = NO;
volumeView.showsVolumeSlider = NO;
[self.view addSubview:volumeView];

查找並保存對UISlider引用:

__weak __typeof(self)weakSelf = self;
[[volumeView subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[UISlider class]]) {
        __strong __typeof(weakSelf)strongSelf = weakSelf;
        strongSelf.volumeSlider = obj;
        *stop = YES;
    }
}];

UIControlEventValueChanged添加目標操作:

[self.volumeSlider addTarget:self action:@selector(handleVolumeChanged:) forControlEvents:UIControlEventValueChanged];

然后檢測音量變化(即通過硬件音量控制):

- (void)handleVolumeChanged:(id)sender
{
    NSLog(@"%s - %f", __PRETTY_FUNCTION__, self.volumeSlider.value);
}

還有其他方法,您可以通過以下方式設置音量:

self.volumeSlider.value = < some value between 0.0f and 1.0f >;

希望這會有所幫助(並且Apple不會從MPVolumeView中刪除MPVolumeSlider)。

這就是我所做的:

func setSystemVolume(volume: Float) {
    let volumeView = MPVolumeView()

    for view in volumeView.subviews {
        if (NSStringFromClass(view.classForCoder) == "MPVolumeSlider") {
            let slider = view as! UISlider
            slider.setValue(volume, animated: false)
        }
    }
}

由於MPMusicPlayerController中的屬性volume在iOS 7中已棄用。這是您可以執行此操作的唯一方法。

您必須使用applicationMusicPlayer而不是iPodMusicPlayer來設置系統音量:

#import <MediaPlayer/MediaPlayer.h>
musicPlayer = [MPMusicPlayerController applicationMusicPlayer];
musicPlayer.volume = 1; // max volume
musicPlayer.volume = 0; // min volume (mute)
musicPlayer.volume = 0.0625; // 1 bar on the overlay volume display

這個(Swift)解決方案對我很有幫助: http//weimenglee.blogspot.com/2015/07/ios-tip-programmatically-adjust-device.html

import MediaPlayer

let volumeView = MPVolumeView()
if let view = volumeView.subviews.first as? UISlider{
    view.value = 0.1 //---0 t0 1.0---

}

這是一個小的包裝類,可以設置系統卷,並在任何更改時通知您(將您自己的更改響應程序傳遞給setTarget:action :)。

編輯 :如果隱藏MPVolumeView控件或不將其添加為子視圖,則只要以編程方式更改卷,系統就會在屏幕中間顯示默認的音量方塊。 如果您不喜歡系統所做的事情,解決方案是在屏幕外設置視圖坐標。 我在下面編輯了我的代碼以反映這一點。

@import MediaPlayer;


@interface SysVolumeControl : MPVolumeView
@property (nonatomic) float value; // from 0 to 1.0
- (void)setTarget:(id)target action:(SEL)action;
@end


@implementation SysVolumeControl
{
    UISlider* _slider;
}

- (id)init
{
    if (self = [super initWithFrame:CGRectMake(-300, 0, 200, 50)])
    {
        for (UIView* view in self.subviews)
        {
            if ([view isKindOfClass:UISlider.class])
            {
                _slider = (UISlider*)view;
                break;
            }
        }
    }
    return self;
}

- (float)value
    { return _slider.value; }

- (void)setValue:(float)value
    { _slider.value = value; }

- (void)setTarget:(id)target action:(SEL)action
    { [_slider addTarget:target action:action forControlEvents:UIControlEventValueChanged]; }

@end

然后創建一個實例並使用它:

SysVolumeControl* sysVolumeControl = [SysVolumeControl new];
[myView addSubview:sysVolumeControl];
sysVolumeControl.value = 1.0;
[sysVolumeControl setTarget:self action:@selector(mySysVolumeResponder:)];

動態創建MPVolumeView以獲取滑塊並設置音量不再適用於iOS 11.4。 我通過向我的UIViewController視圖添加新的MPVolumeView解決了這個問題,否則它沒有設置音量。 當我將它添加到控制器時,我還需要將音量視圖位置設置為在屏幕之外。

代碼在Swift 4中:

let volumeControl = MPVolumeView(frame: CGRect(x: 0, y: 0, width: 120, height: 120))

override func viewDidLoad() {
   self.view.addSubview(volumeControl);
}

override func viewDidLayoutSubviews() {
   volumeControl.frame = CGRect(x: -120, y: -120, width: 100, height: 100);
}

func setMaxVolume() {
    let lst = volumeControl.subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}
    let slider = lst.first as? UISlider

    slider?.setValue(1, animated: false)
}

Swift 3 - 我用這個:

func setVolumeTo(volume: Float) {
  (MPVolumeView().subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}.first as? UISlider)?.setValue(volume, animated: false)
}

應用程序不應更改設備全局設置,您不應該這樣做。 用戶可以使用標准的iOS功能來實現。 相反,如果你播放聲音/視頻,那么使用播放器的volume

var player: AVPlayer!
...
player.volume = 0.5 // 50% level

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM