2011-09-15 20 views
6

C'è un modo per rilevare il pulsante di riproduzione/pausa dell'auricolare?Rileva il pulsante dell'auricolare fai clic su iPhone SDK

sono riuscito a rilevare i clic pulsanti di volume utilizzando:

AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume , audioVolumeChangeListenerCallback, self); 

ma non riesco a trovare un'AudioSessionProperty per il pulsante centrale. Qual è il modo per farlo?

risposta

5

Tutto ciò che viene eseguito dall'esterno dell'app viene considerato un "Evento remoto". Se tocchi due volte il pulsante Home e premi Play/Pausa qui, equivale a premere il pulsante di riproduzione/pausa sull'auricolare (lo stesso per il doppio tocco per il prossimo e il triplo per il precedente).

Ecco la guida su event handling of remote events for iOS.

Personalmente, mi piace sottoclasse il MainWindow (UIWindow) e l'override del metodo sendEvent:, quindi in grado di gestire più direttamente:

- (void)sendEvent:(UIEvent *)event 
{ 
    if (event.type == UIEventTypeRemoteControl) 
    { 
     // Do stuff here 
    } 
    else 
    { 
     // Not my problem. 
     [super sendEvent:event]; 
    } 
} 

Speranza che aiuta, l'enumerazione per l'evento del pulsante centrale è UIEventSubtypeRemoteControlTogglePlayPause .

+0

Grazie Can. Ho trovato un'altra soluzione utilizzando il metodo: "remoteControlReceivedWithEvent:". La soluzione è discussa qui: http://www.iphonedevsdk.com/forum/iphone-sdk-development/44433-there-way-respond-clicks-headphone-buttons.html – MCO

+0

@Can ho provato la tua soluzione e il sendEvent UIEventTypeRemoteControl tipo di evento non viene chiamato quando premo i pulsanti sulla mia cuffia. C'è qualche altro setup che hai fatto per farlo funzionare? La sottoclasse sta funzionando mentre catturo altri eventi. –

0

La risposta di Can era buona, ma penso che sia obsoleta.

Ora è necessario sottoclasse l'applicazione UIA.

codice per main.m

#import <UIKit/UIKit.h> 
#import "AppDelegate.h" 
#import "MyUIApplication.h" 

int main(int argc, char * argv[]) { 
    @autoreleasepool { 
    return UIApplicationMain(
     argc, 
     argv, 
     NSStringFromClass([MyUIApplication class]), 
     NSStringFromClass([AppDelegate class])); 
    } 
} 

Codice per MyUIApplication.m:

@implementation MyUIApplication 
- (void)sendEvent:(UIEvent *)event { 
    if (event.type == UIEventTypeRemoteControl) { 
    // Check event.subtype to see if it's a single click, double click, etc. 
    } else { 
    // Not my problem. 
    [super sendEvent:event]; 
    } 
} 
@end 

Codice per AppDelegate.m:

all'interno di - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

chiamata [application beginReceivingRemoteControlEvents];