2009-04-21 85 views

回答

21

从苹果最近拒绝后

不要使用此。苹果现在使用一些补丁程序,如果它使用任何私有API,它会立即拒绝你的应用程序 - 虽然在这里应该注意到,App Store上的一些应用程序已经使用了它,并且仍然存在!

现在唯一的方法是让AVAudioPlayer准备播放但不播放([player prepareToPlay])。这似乎根据摇杆按钮来调整应用的音量。

目前没有其他公布的方式来处理这个问题。

请阅读以上注意

是,使用MPVolumeView

MPVolumeView *volume = [[[MPVolumeView alloc] initWithFrame:CGRectMake(18.0, 340.0, 284.0, 23.0)] autorelease]; 
    [[self view] addSubview:volume]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(volumeChanged:) 
             name:@"AVSystemController_SystemVolumeDidChangeNotification" 
             object:nil];  
    for (UIView *view in [volume subviews]){ 
    if ([[[view class] description] isEqualToString:@"MPVolumeSlider"]) { 
     volumeViewSlider = view; //volumeViewSlider is a UIView * object 
    } 
    } 
    [volumeViewSlider _updateVolumeFromAVSystemController]; 

-(IBAction)volumeChanged:(id)sender{ 
    [volumeViewSlider _updateVolumeFromAVSystemController]; 
} 

这会给你一个滑块(同一个iPod中使用),其值将改变ACC到的音量电话

您将得到一个编译时警告,视图可能不会响应_updateVolumeFromAVSystemControl,但只是忽略它。

+0

是的,我在想收听VolumeChanged,但我不知道它是否仍然会收到一条消息,当没有实际的VolumeChange发生(例如音量在最大值,我正在增加它)? – COTOHA 2009-04-21 15:24:37

+0

您可以尝试设备上的代码并查看是否收到该事件。 – lostInTransit 2009-04-21 17:48:51

+2

您无法使用此代码发布应用程序,它使用私有API。这就是编译时警告的意思,下划线前缀也是一个赠品。 – duncanwilcox 2009-11-20 14:56:35

1

如果您愿意进入私有API,我有a patch to Wolf3d,它可以增加您正在寻找的功能。它使用私有AVSystemController类和UIApplication

17

如果你只是想通知一些隐藏的方法,我认为是这样的:

请纠正我,如果我错了,但我不相信这使用任何内部API。本次活动的

[[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(volumeChanged:) 
     name:@"AVSystemController_SystemVolumeDidChangeNotification" 
     object:nil]; 

详情请看这里:http://www.cocoadev.com/index.pl?AVSystemController

这里的其他答复似乎是在此基础上黑客:http://blog.stormyprods.com/2008/09/proper-usage-of-mpvolumeview-class.html这是一个现在已经修正了一个解决方法。

但我敢肯定,如果你想要做的是GET的通知,而不是SET系统卷,你可以使用通知中心就像任何其他事件!

被建议:由于Apple向相机添加了音量提升操作,因此此通知是而不是已发布,而UIImagePickerController可见。

1

好吧,

所以,我看到您的解决方案并没有确切地知道苹果是否会拒绝或使用AVSystemController_SystemVolumeDidChangeNotification接受。但我有一个解决方法。

使用MPVolumeViewUISlider像这样

MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectZero]; 

for (UIView *view in [volumeView subviews]) { 
    if ([view.class.description isEqualToString:@"MPVolumeSlider"]){ 
     self.volume_slider = (UISlider*)view; 
     break; 
    } 
} 
[volumeView sizeToFit]; 
#THIS IS THE MAIN LINE. ADD YOUR CALLBACK TARGET HERE 
[self.volume_slider addTarget:self action:@selector(volumeListener:) forControlEvents:UIControlEventValueChanged]; 
[self addSubview:volumeView]; 
[volumeView setAlpha:0.0f]; 

-(void)volumeListener:(NSNotification*)notification { 
    #UPDATE YOUR UI ACCORDING OR DO WHATEVER YOU WANNA DO. 
    #YOU CAN ALSO GET THE SOUND STEP VALUE HERE FROM NOTIFICATION. 
} 

由iPhone硬件体积注册的任何变化让我知道如果这能帮助任何人。

1

要做到这一点,我在学习上面,并在其他线程中提到的所有来源已经找到了最简单,功能最齐全的方式是:JPSVolumeButtonHandler(我不是比当用户参与其他但是由于很多的人负责)

编辑:发布1.0.2带着一些显著的改变/增强。我会把我以前的答案留给低于1.0.1的。

我把样品包装类,您可以部署原样,或用它来学习JPSVolumeButtonHandler在一个separate Github repository real quick here希望正确使用。

这里的包装是怎样来使用(我会尽快让我这个添加到存储库的话):

  1. 单例类有两个标志:isInUseisOnisInUse是指在某种一般的应用程序设置来设置和一般的开启和关闭开关按钮的支持。 所以,无论在任何类其他值,如果这是false什么当用户按下音量按钮和实施确保尽可能保持干净的东西,而不是不必要地影响系统的音量会发生。 (阅读README了解会发生什么,当按钮的支持开启首次提到的问题。) isOn,就是要准确true对于需要按钮的持续时间。您可以打开和关闭它,而不考虑isInUse的当前值。

  2. 无论在哪查看您初始化的应该发生时,音量按钮按下获取的动作,设定的动作,象这样:

    PhysicalButton.shared.action = {/ *做某事* /}

该动作有型() -> Void。在你初始化动作之前,什么都不会中断。什么都不会发生。这种防御功能对我来说很重要,因为只有在设置按钮支持后才能创建使用音量按钮支持的视图。

对于在行动中看到的东西,你可以download the app,我在真正的快速使用这个免费的。一般来说,这些设置操纵“物理按钮支持”。主要的秒表视图是在进入视图时实际切换按钮处理的视图,在离开视图时关闭。如果你发现的时候,你还可以在设置中找到一个重要的注意事项有>用户指南>选项:物理按键支持:

在特殊情况下,应用程序可能没有机会适当 开关音量按钮在秒表视图以外处理...

我会将完整的注释添加到Github README.md。如果它适合您的情况,请随时调整并重用它。

的情况下,实际上并没有那么出色的,我还没有完全想通了,什么是错的。当用户杀死应用程序(或者只是在Xcode中停止你的应用程序时),音量按钮打开时,物理按钮支持可能无法正确从操作系统中删除。因此,你可以结束两个内部处理程序实例,只有其中一个可以控制。因此,每个按钮点击都会导致对操作例程的两次甚至更多的调用。我的包装有一些监护人代码来防止按钮的调用太快。但这只是一个部分解决方案。修复需要进入底层的处理程序,我很遗憾自己仍然没有太多的知识来尝试修复。


老朋友。1.0.1:

尤其是我感兴趣的是迅速解决。代码在Objective-C中。为了节约一些研究,这就是我所做的使用的CocoaPods(对于像我这样的傻瓜):

  1. 添加pod 'JPSVolumeButtonHandler'到podfile
  2. 运行pod install在命令行上
  3. 添加#import <JPSVolumeButtonHandler.h>对于桥接头文件
  4. 设置回调音量上下键,像这样:

    let volumeButtonHandler = JPSVolumeButtonHandler(
        upBlock: { 
         log.debug("Volume up button pressed...") 
         // Do something when the volume up button is pressed... 
        }, downBlock: { 
         log.debug("Volume down button pressed...") 
         // Do something else for volume down... 
        }) 
    

就是这样。其余是可选的。


就我而言,我希望能够覆盖物理按钮,只是选择的看法虚拟屏幕上的按钮按下,同时确保以尽可能少的普通按钮的功能块地(使用户可以在后台运行音乐并在应用程序的其他部分调整音量)。我结束了一个大多数单身人士课程,如下所示:

class OptionalButtonHandler { 

    static var sharedInstance: OptionalButtonHandler? 

    private var volumeButtonHandler: JPSVolumeButtonHandler? = nil 
    private let action:() ->() 

    var enabled: Bool { 
    set { 
     if !enabled && newValue { 
      // Switching from disabled to enabled... 
      assert(volumeButtonHandler == nil, "No leftover volume button handlers") 
      volumeButtonHandler = JPSVolumeButtonHandler(upBlock: { 
       log.debug("Volume up button pressed...") 
       self.action() 
       }, downBlock: { 
        log.debug("Volume down button pressed...") 
        self.action() 
      }) 
     } else if enabled && !newValue { 
      log.debug("Disabling physical button...") 
      // The other way around: Switching from enabled to disabled... 
      volumeButtonHandler = nil 
     } 
    } 
    get { return (volumeButtonHandler != nil) } 
    } 

    /// For one-time initialization of this otherwise singleton class. 
    static func initSharedInstance(action:() ->()) { 
     sharedInstance = OptionalButtonHandler(action: action) 
    } 

    private init(action:() ->()) { 
     self.action = action 
    } 
} 

这里只有一个常用的上下音量按钮的操作。 initSharedInstance()是必要的,因为我的操作包含了对UI元素(视图)的引用,该元素只会在应用启动后的某个用户相关点进行设置。

一次性设置像这样:

OptionalButtonHandler.initSharedInstance({ 
    // ...some UI action 
}) 

启用/禁用选择简单的,像这样:

OptionalButtonHandler.sharedInstance!.enabled = true // (false) 

(请注意,我的代码逻辑可以确保.enabled从未initSharedInstance()之前访问。 )

我运行的Xcode 7.3和(必填项)测试设备在iOS 9.3.2。

期待学习苹果是如何看待他们的超载珍贵的音量按钮。至少我的应用程序确保微创,按钮使用真的很有意义。这不是一款相机应用程序,但可比较的应用程序之前使用过物理音量按钮(甚至不太好)。