8

MP ミュージック プレーヤーで間違った再生状態が表示されます。曲の再生中に一時停止状態になります。私のアプリは iOS 4 で正常に動作していますが、iOS 5 でこの問題が発生しています。

私のコードはここにあります。

[musicPlayer stop];
if (userMediaItemCollection)
{
   userMediaItemCollection=nil; 
}
musicPlayer.nowPlayingItem=nil;

userMediaItemCollection=[MPMediaItemCollection collectionWithItems:[mediaItemCollection    items]];

[musicPlayer setQueueWithItemCollection:userMediaItemCollection];
[musicPlayer setNowPlayingItem:    
[[userMediaItemCollectionitems]objectAtIndex:indexOfCurrentObject]];
[self enablePrevAndNextButtons];

[musicPlayer play];        
}

-(void)playbackStateDidChanged:(NSNotification *)notification
{

 if (musicPlayer.playbackState!=MPMusicPlaybackStatePlaying)
 {
    [playPauseButton setBackgroundImage:[UIImage imageNamed:@"play_iPad.png"] forState:UIControlStateNormal];
 }
 else if(musicPlayer.playbackState==MPMusicPlaybackStatePlaying)
 {
    [playPauseButton setBackgroundImage:[UIImage imageNamed:@"pause_iPad.png"] forState:UIControlStateNormal];
 }
4

5 に答える 5

4

また、このバグを Apple に報告しました。以下を実行することで、100%再現できました。

MPMusicPlayerController を使用するアプリケーションを起動します。「ミュージック」アプリを起動します。Play、Skip、Skip、Pause、Play、Pause を押す 元のアプリケーションを開くと、MPMusicPlayerController の MPMusicPlaybackState が正しくなくなります。

ここで提案された解決策はどれもうまくいきませんでした。うまくいった解決策は、バグがいつ発生したかを追跡し、これらの場合に特別に UI を更新することでした。

通知が受信されたらUIApplicationDidBecomeActiveNotification(詳細については、matbur の投稿を参照してください)、MPMusicPlaybackState が次のように述べたときにオーディオが実際に再生されていないかどうかを確認します。

-(BOOL) isPlaybackStateBugActive {
    MPMusicPlaybackState playbackState = self.musicPlayer.playbackState;
    if (playbackState == MPMusicPlaybackStatePlaying) {
        AudioSessionInitialize (NULL, NULL, NULL, NULL);
        UInt32 sessionCategory = kAudioSessionCategory_AmbientSound;
        AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory);
        AudioSessionSetActive (true);

        UInt32 audioIsPlaying;
        UInt32 size = sizeof(audioIsPlaying);
        AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &size, &audioIsPlaying);

        if (!audioIsPlaying){
            NSLog(@"PlaybackState bug is active");
            return YES;
        }
    }

    return NO;
}

AudioToolbox フレームワークをインポートすることを忘れないでください。

于 2012-11-18T20:36:50.397 に答える
3

これらの回避策のいずれも、私のアプリの問題を修正しません。これはiOSのバグであり、Appleが修正するまで、私のアプリは正しく機能しません。

再生/一時停止ボタン付きの音楽プレーヤーがあります。音楽の再生中は、ボタンに「一時停止」アイコンが表示されます。音楽が一時停止されると、すべての音楽アプリと同じように、ボタンに「再生」アイコンが表示されます。次の手順を実行することで、いつでもバグを再現できます。1.アプリで音楽を再生します(再生/一時停止ボタンに「一時停止」アイコンが正しく表示されます)2。アプリをバックグラウンドで起動し、電話を約10分間ロックします3.ダブルホームをタップしてiPodコントロールから一時停止ボタンを押します4.電話のロックを解除してアプリを再度開きます5.音楽は停止しますが、アプリは「再生」する必要があるときに「一時停止」アイコンを表示します

アプリケーションがアクティブになったときに再生/一時停止ボタンを更新するメソッドが常に呼び出されるように、広範なデバッグとログ記録を行いました。問題は、アプリを再起動すると、音楽が停止/一時停止されている場合でも、MPMusicPlayerの再生状態がMPMusicPlaybackStatePlayingに設定されたままになることです。

私はこれについて約1年前にバグレポートを提出しましたが、Appleから何も聞いていません。他の誰かがそれを提出するならば、それは大いにありがたいです。

于 2012-09-27T13:43:30.373 に答える
0

私は同じ問題を抱えていますが、アプリがバックグラウンドで何度も再生/一時停止すると、Apple にバグを報告し、すぐに回答を得たいと思っています。コーディングが間違っているか、API の問題があるかどうかを知りたいです。これが発生していたエラーである場合、これが役立つ場合があります。最善の解決策ではありませんが、アプリが受け入れられる回避策にたどり着きました:

viewDidLoad で、これを追加します。

NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver: self
                       selector: @selector (handle_ApplicationDidBecomeActive:)
                           name: UIApplicationDidBecomeActiveNotification
                         object: nil];

次に、handle_ApplicationDidBecomeActive メソッドを作成し、これを追加します。

- (void) handle_ApplicationDidBecomeActive: (id) notification
{
    if (musicPlayer.playbackState!=MPMusicPlaybackStatePlaying)
    {
       [playPauseButton setBackgroundImage:[UIImage imageNamed:@"play_iPad.png"] forState:UIControlStateNormal];
       [musicPlayer pause];
    }
    else if(musicPlayer.playbackState==MPMusicPlaybackStatePlaying)
    {
       [playPauseButton setBackgroundImage:[UIImage imageNamed:@"pause_iPad.png"] forState:UIControlStateNormal];
       [musicPlayer pause];
    }
}

(無限ループが発生する可能性があるため、このコードを PlaybackStateDidChanged メソッド内に配置しないでください)

これにより、ボタンと音楽プレーヤーの状態が、API によって報告された状態と同期されます。偶然があった場合、いかなるタイプの影響もありません。それ以外の場合、プレーヤーはそれに応じて一時停止/再生します。

于 2012-04-13T05:50:07.923 に答える
0

私は iOS 5 のリリースで同じ問題を経験しました。playbackState プロパティが更新されることがわかりましたが、遅れて、playbackStateDidChanged メソッドの実行時にまだ設定されていません。

私の回避策は、再生を開始するたびに musicPlayerRecentlyStartedPlaying という独自のインスタンス変数を設定することでした。次に、タイマーから呼び出されるメソッドを使用して、その変数と PlaybackState プロパティの両方をチェックし、プレーヤーが実際に再生しているかどうかを調べます。

- (void)playMusic {
    [self.musicPlayer play];
    self.musicPlayerRecentlyStartedPlaying = TRUE;
    self.musicControlsUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateMusicControls:) userInfo:nil repeats:TRUE];
}

- (void)stopMusic {
    [self.musicPlayer stop];
    self.musicPlayerRecentlyStartedPlaying = FALSE;
    [self.musicControlsUpdateTimer invalidate];
}

- (void)updateMusicControls:(NSTimer *)timer {
    BOOL playing = (([self.musicPlayer playbackState] == MPMusicPlaybackStatePlaying)&&(self.musicPlayer.nowPlayingItem));
    if (!playing) {
        // check to see if we recently started playing
        if (self.musicPlayerRecentlyStartedPlaying) {
            playing = TRUE;
        }
    } else {
        // once the property is updated, we no longer need this
        self.musicPlayerRecentlyStartedPlaying = FALSE;
    }
}

タイマーから updateMusicControls を呼び出す必要はないかもしれませんが、音楽の再生に合わせてプログレス バーの位置も更新するので呼び出します。

于 2012-06-19T18:39:17.800 に答える