web-dev-qa-db-ja.com

iOSでデバイスの音量を変更する方法-音楽の音量ではありません

IOS(iphone)でデバイスの音量を変更したい。

以下の行で音楽ライブラリの音量を変更できることを知っています。

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

しかし、それは私の目的ではありません。
デバイスの音量を変更するか、リンガーの音量を変更します。

どうやってやるの? [〜#〜] device [〜#〜] volumeを変更するだけですか?

15
brush51

Brush51の質問に答えるには:

どうやってやるの?デバイスの音量を変更するだけですか?

0x7fffffffが示唆したように:

プログラムでデバイスの音量を変更することはできませんが、MPVolumeView(音量スライダー)はデバイスの音量を変更するためにありますが、ユーザーの操作によってのみ変更できます。

したがって、AppleはMPVolumeViewの使用を推奨しているので、私はこれを思いついた:

volumeSliderプロパティを追加します:

@property (nonatomic, strong) UISlider *volumeSlider;

MPVolumeViewを初期化し、ビューのどこかに追加します(showsRouteButton = NOおよびshowsVolumeSlider = 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を削除しません)。

17
msrdjan

これが私がしたことです:

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)
        }
    }
}

volumeのプロパティMPMusicPlayerControllerはiOS7で非推奨になったため、これはこれを実行できる唯一の方法です。

8
Nikita Zernov

この(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---

}
6
Lars335

システムボリュームを設定するには、iPodMusicPlayerの代わりにapplicationMusicPlayerを使用する必要があります。

#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
6
Paul Slocum

これは、システムボリュームを設定し、変更を通知することができる小さなラッパークラスです(独自の変更レスポンダーを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:)];
2
mojuba

スライダーを取得して音量を設定するためにその場でMPVolumeViewを作成することは、iOS11.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)
}
1

Swift-私はこれを使用します:

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

アプリはデバイスのグローバル設定を変更しないでください。また、変更しないでください。ユーザーは、標準のiOS機能を使用してそれを行うことができます。代わりに、サウンド/ビデオを再生する場合は、プレーヤーのvolumeを使用してください。

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