有什么办法可以订阅音量按钮按下事件?程序访问iPhone音量按钮
回答
从苹果最近拒绝后
不要使用此。苹果现在使用一些补丁程序,如果它使用任何私有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,但只是忽略它。
如果您愿意进入私有API,我有a patch to Wolf3d,它可以增加您正在寻找的功能。它使用私有AVSystemController
类和UIApplication
如果你只是想通知一些隐藏的方法,我认为是这样的:
请纠正我,如果我错了,但我不相信这使用任何内部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
可见。
好吧,
所以,我看到您的解决方案并没有确切地知道苹果是否会拒绝或使用AVSystemController_SystemVolumeDidChangeNotification
接受。但我有一个解决方法。
使用MPVolumeView
UISlider
像这样
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硬件体积注册的任何变化让我知道如果这能帮助任何人。
要做到这一点,我在学习上面,并在其他线程中提到的所有来源已经找到了最简单,功能最齐全的方式是:JPSVolumeButtonHandler(我不是比当用户参与其他但是由于很多的人负责)
编辑:发布1.0.2带着一些显著的改变/增强。我会把我以前的答案留给低于1.0.1的。
我把样品包装类,您可以部署原样,或用它来学习JPSVolumeButtonHandler在一个separate Github repository real quick here希望正确使用。
这里的包装是怎样来使用(我会尽快让我这个添加到存储库的话):
单例类有两个标志:
isInUse
和isOn
。isInUse
是指在某种一般的应用程序设置来设置和一般的开启和关闭开关按钮的支持。 所以,无论在任何类其他值,如果这是false
什么当用户按下音量按钮和实施确保尽可能保持干净的东西,而不是不必要地影响系统的音量会发生。 (阅读README了解会发生什么,当按钮的支持开启首次提到的问题。)isOn
,就是要准确true
对于需要按钮的持续时间。您可以打开和关闭它,而不考虑isInUse
的当前值。无论在哪查看您初始化的应该发生时,音量按钮按下获取的动作,设定的动作,象这样:
PhysicalButton.shared.action = {/ *做某事* /}
该动作有型() -> Void
。在你初始化动作之前,什么都不会中断。什么都不会发生。这种防御功能对我来说很重要,因为只有在设置按钮支持后才能创建使用音量按钮支持的视图。
对于在行动中看到的东西,你可以download the app,我在真正的快速使用这个免费的。一般来说,这些设置操纵“物理按钮支持”。主要的秒表视图是在进入视图时实际切换按钮处理的视图,在离开视图时关闭。如果你发现的时候,你还可以在设置中找到一个重要的注意事项有>用户指南>选项:物理按键支持:
在特殊情况下,应用程序可能没有机会适当 开关音量按钮在秒表视图以外处理...
我会将完整的注释添加到Github README.md。如果它适合您的情况,请随时调整并重用它。
的情况下,实际上并没有那么出色的,我还没有完全想通了,什么是错的。当用户杀死应用程序(或者只是在Xcode中停止你的应用程序时),音量按钮打开时,物理按钮支持可能无法正确从操作系统中删除。因此,你可以结束两个内部处理程序实例,只有其中一个可以控制。因此,每个按钮点击都会导致对操作例程的两次甚至更多的调用。我的包装有一些监护人代码来防止按钮的调用太快。但这只是一个部分解决方案。修复需要进入底层的处理程序,我很遗憾自己仍然没有太多的知识来尝试修复。
老朋友。1.0.1:
尤其是我感兴趣的是迅速解决。代码在Objective-C中。为了节约一些研究,这就是我所做的使用的CocoaPods(对于像我这样的傻瓜):
- 添加
pod 'JPSVolumeButtonHandler'
到podfile - 运行
pod install
在命令行上 - 添加
#import <JPSVolumeButtonHandler.h>
对于桥接头文件 设置回调音量上下键,像这样:
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。
期待学习苹果是如何看待他们的超载珍贵的音量按钮。至少我的应用程序确保微创,按钮使用真的很有意义。这不是一款相机应用程序,但可比较的应用程序之前使用过物理音量按钮(甚至不太好)。
- 1. iPhone - 音量/静音按钮
- 2. LocalPushNotification声音和iPhone的音量按钮
- 3. Iphone提示框像音量按钮
- 4. 按下主页按钮后iPhone应用程序没有声音
- 5. 访问按钮的变量
- 6. iphone sdk按钮声音
- 7. 检测音量按钮按
- 8. 长按主页按钮/音量按钮启动iOS应用程序
- 9. iPhone音乐库访问
- 10. 按下按钮测量音量
- 11. 按音量按钮按下按下AVAudioPlayer
- 12. iPhone按钮问题
- 13. 访问iPhone应用程序中的现有语音笔记
- 14. Google语音HTML5应用如何访问iPhone拨号程序?
- 15. Android应用程序音频按钮
- 16. 使用变量访问按钮名称
- 17. 访问cgridview中按钮的$ data变量
- 18. 按下按钮后访问
- 19. iPhone程序上的粘滞按钮
- 20. iPhone应用程序动作按钮
- 21. 按住android上的音量按钮?
- 22. 当按下音量按钮时检测
- 23. 音乐按钮的应用程序 - 多媒体音量和电话
- 24. 您可以绕过iPhone的电源或音量按钮吗
- 25. iPhone - 无法用硬按钮调节音量
- 26. 使用音量增加按钮拍照的方法iPhone
- 27. iPhone:使用按钮实现音量控制
- 28. 静音AVFoundation声音与物理静音iPhone按钮
- 29. Facebook应用程序认证取消按钮问题iPhone
- 30. 使用网络应用程序访问Google登录按钮的可访问性
是的,我在想收听VolumeChanged,但我不知道它是否仍然会收到一条消息,当没有实际的VolumeChange发生(例如音量在最大值,我正在增加它)? – COTOHA 2009-04-21 15:24:37
您可以尝试设备上的代码并查看是否收到该事件。 – lostInTransit 2009-04-21 17:48:51
您无法使用此代码发布应用程序,它使用私有API。这就是编译时警告的意思,下划线前缀也是一个赠品。 – duncanwilcox 2009-11-20 14:56:35