zoukankan      html  css  js  c++  java
  • 自定义实现MPVolumeView音量控件

    http://blog.csdn.net/theonezh/article/details/8158420
    http://www.cnblogs.com/cate/ios/
    http://www.cnblogs.com/pinping/archive/2012/10/12.html
    http://www.cnblogs.com/entlibforum/archive/2012/10/16/2725411.html
    http://www.cocoachina.com/applenews/devnews/2012/1114/5085.html


    http://mobilesolutions.blog.163.com/blog/static/189224176201111725559550/


    在ios中可以使用MPVolumeView来调节音量,缺点是UI是固定的,而且静音的时候会显示“No Volume Available”。自定义的volume view能避免这些问题。

    自定义的volume view的UI部分比较好实现,在这里主要谈下静音键和音量键事件的处理。

    判断是否静音:

    - (BOOL)isMuted
    {
    CFStringRef route;
    UInt32 routeSize = sizeof(CFStringRef);
    OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute,&routeSize, &route);
    if (status == kAudioSessionNoError)
    {
    if (route == NULL || !CFStringGetLength(route))
    return TRUE;
    }
    return FALSE;
    }
    
    监听静音键:
    - (BOOL)addMutedListener
    {
    OSStatus s = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,
    audioRouteChangeListenerCallback,
    self);
    return s == kAudioSessionNoError;
    }
    回调函数:
    void audioRouteChangeListenerCallback (void *inUserData,
    AudioSessionPropertyID inPropertyID,
    UInt32 inPropertyValueSize,
    const void *inPropertyValue
    )
    {
    if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return;
    BOOL muted = [mediaVolume isMuted];
    // add code here
    }
    
    设置和获取音量:
    - (float)volume
    {
    return [[MPMusicPlayerController applicationMusicPlayer] volume];
    }
    - (void)setVolume:(float)newVolume
    {
    [[MPMusicPlayerController applicationMusicPlayer] setVolume:newVolume];
    }
    
    监听音量键:
    - (BOOL)addHardKeyVolumeListener
    {
    OSStatus s = AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume,
    audioVolumeChangeListenerCallback,
    self);
    return s == kAudioSessionNoError;
    }
    
    音量键回调函数:
    void audioVolumeChangeListenerCallback (void *inUserData,
    AudioSessionPropertyID inPropertyID,
    UInt32 inPropertyValueSize,
    const void *inPropertyValue)
    {
    if (inPropertyID != kAudioSessionProperty_CurrentHardwareOutputVolume) return;
    Float32 value = *(Float32 *)inPropertyValue;
    MediaVolume *mediaVolume = (MediaVolume *)inUserData;
    // add code here
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    修改系统音量(SystemVolume)的方法   

     
     
    看到很多朋友在问能不能修改系统的音量,所以我也去找了一下。
    发现,SDK中确实有设置system volume的方法,是一个private class,官方不允许使用,所以就算你用了,苹果的审核也不会通过,因为标明了,那个是私有的类!

    还有人提到MPVolumeView,这个可以,但是这个的实现,是在屏幕中创建一个音量条,来取代原来按侧边键出来的大喇叭。
    是可以达到同步设置的。但是音量只能由用户手动拖动音量条控制。
    附上简单的使用代码,因为我是在cocos2d里面试的,所以就加到window里面了。

    MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:window.bounds] autorelease];
    [window addSubview:volumeView]; 
    [volumeView sizeToFit];


    我找了一下,发现一个类,就是MPMusicPlayerController。我们用来播放音乐的。MPVolumeView应该算是其中的一个组件吧。
    这个类有一个值,volume~可以直接设置,而且,最总要的是,他可以同步系统音量,且不会显示出来。

    用法很简单。
    MPMusicPlayerController *mpc = [MPMusicPlayerController applicationMusicPlayer];
    mpc.volume = 0;  //0.0~1.0


    用这个方法可以绕过那些麻烦的底层控制,用官方写好的东西,达到我们要的效果。
    大家试试看,看看行不行~
  • 相关阅读:
    Redis cluster学习 & Redis常识 & sort操作
    【Todo】【转载】JVM学习
    【Todo】【转载】Java中的锁机制2
    【转载】git命令和svn的对比
    【Todo】抽象渗漏法则 & 找到理想员工 & 软件开发成功 12 法则 & Joel on Software
    【转载】Java中的锁机制 synchronized & 偏向锁 & 轻量级锁 & 重量级锁 & 各自优缺点及场景 & AtomicReference
    JS里面匿名函数的调用 & 变量作用域的实验
    【Todo】深入理解Java虚拟机 读书笔记
    poj 2503 Babelfish
    hdu4493 Tutor
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3265475.html
Copyright © 2011-2022 走看看