Frage

Ich kann nicht scheinen, in dem SDK zu finden, wie programmatisch auf dem iPhone den Mute-Taste / Schalter zu erfassen. Wenn meine app Hintergrundmusik spielt, ist es richtig auf die Lautstärke-Taste reagiert, ohne dass ich irgendCode zu folgen, aber, wenn ich den Mute-Schalter verwenden, hält sie nur spielen weg.

Wie teste ich die Position des Mute?

(ANMERKUNG:. Mein Programm hat seinen eigenen Mute-Schalter, aber ich würde den physischen Schalter mag, dass außer Kraft zu setzen)

War es hilfreich?

Lösung

Danke, JPM. Tatsächlich der Link führt auf die richtige Antwort zu geben (eventuell;). Für die Vollständigkeit (! Weil S. O. soll eine Quelle für schnelle Antworten sein) ...

// "Ambient" makes it respect the mute switch
// Must call this once to init session
if (!gAudioSessionInited)
{
    AudioSessionInterruptionListener    inInterruptionListener = NULL;
    OSStatus    error;
    if ((error = AudioSessionInitialize (NULL, NULL, inInterruptionListener, NULL)))
    {
        NSLog(@"*** Error *** error in AudioSessionInitialize: %d.", error);
    }
    else
    {
        gAudioSessionInited = YES;
    }
}

SInt32  ambient = kAudioSessionCategory_AmbientSound;
if (AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (ambient), &ambient))
{
    NSLog(@"*** Error *** could not set Session property to ambient.");
}

Andere Tipps

Ich antwortete eine ähnliche Frage hier (Link) . Der entsprechende Code:

 -(BOOL)silenced {
     #if TARGET_IPHONE_SIMULATOR
         // return NO in simulator. Code causes crashes for some reason.
         return NO;
     #endif

    CFStringRef state;
    UInt32 propertySize = sizeof(CFStringRef);
    AudioSessionInitialize(NULL, NULL, NULL, NULL);
    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
    if(CFStringGetLength(state) > 0)
            return NO;
    else
            return YES;

    }

Einige der Code in anderen Antworten (einschließlich der akzeptierte Antwort) kann nicht funktionieren, wenn Sie nicht in der Umgebungsmodus befinden, wo der Mute-Schalter eingehalten wird.

Ich schrieb die Routine unten auf Umgebungs zu schalten, um den Schalter lesen, und dann auf die Einstellungen kehre ich in meiner Anwendung benötigen.

-(BOOL)muteSwitchEnabled {

#if TARGET_IPHONE_SIMULATOR
    // set to NO in simulator. Code causes crashes for some reason.
    return NO;
#endif

// go back to Ambient to detect the switch
AVAudioSession* sharedSession = [AVAudioSession sharedInstance];
[sharedSession setCategory:AVAudioSessionCategoryAmbient error:nil];

CFStringRef state;
UInt32 propertySize = sizeof(CFStringRef);
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);

BOOL muteSwitch = (CFStringGetLength(state) <= 0);
NSLog(@"Mute switch: %d",muteSwitch);

// code below here is just restoring my own audio state, YMMV
_hasMicrophone = [sharedSession inputIsAvailable];
NSError* setCategoryError = nil;

if (_hasMicrophone) {

    [sharedSession setCategory: AVAudioSessionCategoryPlayAndRecord error: &setCategoryError];

    // By default PlayAndRecord plays out over the internal speaker.  We want the external speakers, thanks.
    UInt32 ASRoute = kAudioSessionOverrideAudioRoute_Speaker;
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,
                             sizeof (ASRoute),
                             &ASRoute
                             );
}
else
    // Devices with no mike don't support PlayAndRecord - we don't get playback, so use just playback as we don't have a microphone anyway
    [sharedSession setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError];

if (setCategoryError)
    NSLog(@"Error setting audio category! %@", setCategoryError);

return muteSwitch;
}

Um den Zustand des Mute-Schalter erfahren Sie und die Lautstärke Ich schrieb diese beiden Funktionen. Diese sind ideal, wenn Sie möchten, den Benutzer warnen, bevor sie versuchen, Audio-Ausgang zu schaffen.

-(NSString*)audioRoute
{
    CFStringRef state;
    UInt32 propertySize = sizeof(CFStringRef);
    OSStatus n = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
    if( n )
    {
        // TODO: Throw an exception
        NSLog( @"AudioSessionGetProperty: %@", osString( n ) );
    }

    NSString *result = (NSString*)state;
    [result autorelease];
    return result;
}

-(Float32)audioVolume
{
    Float32 state;
    UInt32 propertySize = sizeof(CFStringRef);
    OSStatus n = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareOutputVolume, &propertySize, &state);
    if( n )
    {
        // TODO: Throw an exception
        NSLog( @"AudioSessionGetProperty: %@", osString( n ) );
    }
    return state;
}
-(BOOL)isDeviceMuted
{
 CFStringRef state;
 UInt32 propertySize = sizeof(CFStringRef);
 AudioSessionInitialize(NULL, NULL, NULL, NULL);
 AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
 return (CFStringGetLength(state) > 0 ? NO : YES);
}

Olie,

Ich glaube, Sie die Antwort auf Ihre Frage finden Sie hier:

https://devforums.apple.com/message/1135#1135

Ich gehe davon aus Sie Zugriff auf das Entwickler-Forum bei Apple.com haben:)

Ich folgte die allgemeine Theorie hier und bekam dies funktioniert http://inforceapps.wordpress.com / 2009/07/08 / Ermittlungs- Mute-Schalter-state-on-iphone /

Hier ist eine kurze Zusammenfassung: Jetzt kurzen Stumm Ton. Zeit, wie lange es dauert, zu spielen. Wenn der Mute-Schalter eingeschaltet ist, wird das Abspielen des Sounds wieder viel kürzer als der Klang selbst. Ich benutzen einen 500ms Ton und wenn der Ton in weniger als diese Zeit gespielt, dann wird der Mute-Schalter war. Ich benutze Audio Service den stillen Ton zu spielen (was immer den Mute-Schalter zeichnet). Dieser Artikel besagt, dass Sie AVAudioPlayer verwenden können diesen Ton zu spielen. Wenn Sie AVAudioPlayer verwenden, gehe ich davon aus Sie Ihre AVAudioSession der Kategorie Setup benötigen die Mute-Schalter zu ehren, aber ich habe nicht versucht Es `.

Mit Ambient Modus für ein Video abgespielt wird und PlayAndRecord Modus für ein Video auf Kamera der Aufzeichnung des Bildschirms, behebt das Problem in unserem Fall.

Der Code in der Anwendung: didFinishLaunchingWithOptions:

NSError *error = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&error];
[[AVAudioSession sharedInstance] setMode:AVAudioSessionModeVideoRecording error:&error];
[[AVAudioSession sharedInstance] setActive:YES error:&error];

Der Code in viewWillAppear auf cameraController, wenn Sie die Kamera verwenden, oder die Aufnahme in Ihrer App

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

Der Code in viewWillDisappear auf cameraController

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];

Mit Hilfe dieser Linien unsere Applikations Aufzeichnungen und spielt eine Video-und Mute-Schalter arbeitet unter perfekt sowohl iOS8 und iOS7 !!!

  

Für Swift

Im Folgenden Rahmen funktioniert perfekt in Gerät

https://github.com/akramhussein/Mute

Installieren Sie einfach mit pod oder Herunterladen von Git

pod 'Mute'

und verwendet wie unter Code

import UIKit
import Mute

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel! {
        didSet {
            self.label.text = ""
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Notify every 2 seconds
        Mute.shared.checkInterval = 2.0

        // Always notify on interval
        Mute.shared.alwaysNotify = true

        // Update label when notification received
        Mute.shared.notify = { m in
            self.label.text = m ? "Muted" : "Not Muted"
        }

        // Stop after 5 seconds
        DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
            Mute.shared.isPaused = true
        }

        // Re-start after 10 seconds
        DispatchQueue.main.asyncAfter(deadline: .now() + 10.0) {
            Mute.shared.isPaused = false
        }
    }

}

Hier zwei Beispiele, wie AudioSessionInitialize verwenden: http://www.restoroot.com/Blog/2008/12 / 25 / audiosessioninitialize-Abhilfen /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top