32

Ring/Silent スイッチがアクティブかどうかを検出するために、これらの方法を使用してみました。

iPhoneのミュートスイッチをプログラムで感知する方法は?

AVAudioSession カテゴリがドキュメントの指示どおりに機能しない

しかし、私の iPhone 4 では、「状態」の値は常に「スピーカー」です (また、CFStringGetLength(state) によって返される長さの値は常に 7 です)。この方法を使って成功した人はいますか? もしそうなら、どのような種類のデバイスと SDK のバージョンですか?

私はそれを次のように呼んでいます:


- (BOOL)deviceIsSilenced {
    CFStringRef state;
    UInt32 propertySize = sizeof(CFStringRef);
    OSStatus audioStatus = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
    if (audioStatus == kAudioSessionNoError) {
        NSLog(@"audio route: %@", state) // "Speaker" regardless of silent switch setting, but "Headphone" when my headphones are plugged in
        return (CFStringGetLength(state) <= 0);
    }
    return NO;
}

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    audioSession.delegate = self;
    [audioSession setCategory:AVAudioSessionCategoryAmbient error:nil];
    [audioSession setActive:YES error:nil];
    NSLog(@"muted? %i", [self deviceIsSilenced]);
    ...
}

電話の物理スイッチが切り替えられたときに、他の(より正確な)kAudioSessionPropertyイベントが発生するのではないかと考えていました。誰にもアイデアはありますか?

ちなみに、[AVAudioSession sharedInstance] で AVAudioSessionCategoryAmbient カテゴリを使用しています。

更新:また、さまざまなオーディオ カテゴリと他のいくつかのオーディオ セッション プロパティを使用してみましたが、スイッチをミュート/ミュート解除するときに何も起動しないようです。:(

2014 年 1 月 1 日更新:ちょっとしたハックです。iPhone 5S でマルチタスクを実行しているときにクラッシュが発生しましたが、新しく受け入れられた回答にリンクされているSoundSwitchライブラリが、サイレントスイッチ。iOS 7 でも動作します。

4

7 に答える 7

31

開発者フォーラムの誰かのおかげで答えを見つけましたが、皆さんは気に入らないでしょう!

これについてAppleから回答がありました。

彼らは、ハードウェアのミュート スイッチを検出する方法を提供していないし、提供したこともないし、提供するつもりもないと述べています。

:(

IMOサイレントスイッチを検出し、それがオンになっていることを忘れた場合にユーザーに通知することには間違いなく価値があります...音が出ないという苦情があり、サイレントスイッチが理由でした! しかたがない。

PS: Apple にこの機能を追加してほしい場合は (もちろんそうします!)、http://bugreport.apple.com/で「iPhone SDK」の新しい「拡張」バグレポートを提出してください。

更新:ミュート スイッチのステータスを確認する公式の方法はまだありませんが、「SoundSwitch」という回避策/ライブラリがあり、うまくいくようです。リンクの新しく受け入れられた回答を確認してください。

于 2011-11-04T12:17:54.977 に答える
0

OK、kAudioSessionProperty_AudioRouteCMD +クリックを使用してフォローした後、私はこれを見つけました:(

/*!
 @enum           AudioSession audio categories states
 @abstract       Deprecated AudioSession properties
 @constant       kAudioSessionProperty_AudioRoute 
 Deprecated in iOS 5.0; Use kAudioSessionProperty_AudioRouteDescription 
 */
enum {
    kAudioSessionProperty_AudioRoute                            = 'rout',   // CFStringRef      (get only)        
};

使用する必要があることがわかりましkAudioSessionProperty_AudioRouteDescriptionたが、この男はCFDictionaryRef何かを返します、そして私はそれをどのように扱うべきか全くわかりません....

誰も私たちに使い方を教えてくれない場合に備えて、私はこれを答えましたkAudioSessionProperty_AudioRouteDescription、そこで私は私の答えを受け入れようとします...

しかし、誰かがこれの使い方を教えてくれればkAudioSessionProperty_AudioRouteDescription、その恩恵は当然彼のものです。

編集:

明らかに、これはiOS5の問題です。あまりにも明白に見えたので、私は以前にこれを述べませんでした、しかしそれから私はそれが検索エンジンにそれほど明白ではないかもしれないと思いました..あなたが私の言いたいことを理解するならば。

そのため、参照されている非推奨の値のため、iOS5はiPhoneのサイレント/ミュートスイッチで動作しません。

于 2011-10-16T15:33:47.933 に答える
0

このライブラリを見つけました http://www.verietassoftware.com/index.php?option=com_content&view=article&id=27&Itemid=115

Apple はそのようなことを許可しますか? これは、オーディオと電話の設定でいくつかの黒魔術を行う 500Kb ライブラリです。

于 2012-03-18T16:09:40.190 に答える
0

あなたは間違った印象を持っていると思います。ルートはそれが行くところです。音量レベルを知りたい。使用するkAudioSessionProperty_CurrentHardwareOutputVolume

于 2011-10-20T13:52:08.410 に答える
0

deviceIsSilenced 内の AudioSessionGetProperty への呼び出しの上にこの行を挿入してみてください

AudioSessionInitialize(NULL, NULL, NULL, NULL);

次に、スイッチが押されたときに空の文字列を返し始める必要があります (ただし、たとえば BT ヘッドセットまたはアクセサリが接続されている場合は、ヘッドフォンやその他の状態が表示されます)。

FWIW実際のスイッチが動かされたときに起動するパブリックAPIには何もないと思います。

于 2011-08-02T18:32:10.850 に答える