3

スイッチを使用してデバイスをサイレント モードにすると、AudioServicesAddSystemSoundCompletionコールバック メソッドが呼び出されません。スイッチがオンの場合、つまりデバイスがサイレント モードでない場合、メソッドは完全に呼び出されます。

誰もがこのようなことを経験したことがありますか。これはバグですか?

4

3 に答える 3

2

サイレント モードでも、soundDidFinishPlaying コールバックに NSTimer を使用する方法を次に示します。

    - (IBAction)playSelectedSound:(id)sender {

    if (!self.isPlaying)
    {        

        // playing the sound

        NSString *fileName = [soundsFileNames objectAtIndex:self.selectedIndex];

        SystemSoundID topClick;
        NSBundle *bundle = [NSBundle mainBundle];
        NSString *topClikFile = [bundle pathForResource:fileName ofType:@"aiff"];

        AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL URLWithString:topClikFile], &topClick);
        AudioServicesPlaySystemSound(topClick);

        // getting the file duration

        AudioFileID audioFileID;
        AudioFileOpenURL((__bridge CFURLRef)[NSURL URLWithString:topClikFile], kAudioFileReadPermission, 0, &audioFileID);

        NSTimeInterval seconds;
        UInt32 propertySize = sizeof(seconds);
        OSStatus st = AudioFileGetProperty(audioFileID, kAudioFilePropertyEstimatedDuration, &propertySize, &seconds);

        // fire the timer
        if (st == 0)
        {
            [NSTimer scheduledTimerWithTimeInterval:seconds target:self selector:@selector(soundDidFinishPlaying) userInfo:nil repeats:NO];
        }

        self.isPlaying = YES;

    }
}



- (void)soundDidFinishPlaying {

    self.isPlaying = NO;
}
于 2012-03-24T23:03:07.213 に答える
2

私も同じ問題を抱えていました。これはバグではありません。デバイスがミュートされているためにサウンドが再生されない場合、コールバックは呼び出されません。

回避策は、再生されるサウンドと同じ長さの NSTimer を使用することです。サウンドが再生されない場合は、タイマー コールバックが呼び出されます。コールバックと同じコードを実行できます。

于 2012-01-26T20:04:31.293 に答える
0

Sound Switchのソース コード(デモ プロジェクトを使用) は、デバイスがサイレント モードの場合にもコールバックが実際に発生することを示しています。

iPhone 5のiOS 8.1でこれを試し、デバイスのボタンでサイレントモードをオフ/オンにしました。

于 2015-01-26T10:04:12.007 に答える