2012-04-12 6 views
7

Tôi đang phát trạng thái phát sai trong trình phát nhạc MP. khi phát bài hát tôi đang nhận trạng thái tạm dừng. Ứng dụng của tôi hoạt động tốt trong ios 4. nhưng tôi gặp vấn đề này trong ios 5. ai cũng có thể giúp tôi?Trạng thái phát lại sai trong Trình điều khiển trình phát nhạc MP trong ios 5

Mã của tôi ở đây.

[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]; 
} 
+0

bạn có thể hiển thị một số đoạn mã ở đây ..? – Kamarshad

+0

@Kamarshad Câu hỏi được chỉnh sửa bằng mã. –

+0

@VivekParikh - Vui lòng kiểm tra câu hỏi sau. http://stackoverflow.com/questions/8854923/did-mpmusicplayercontroller-change-with-ios-5 – itsaboutcode

Trả lời

0

Tôi có cùng một vấn đề nhưng khi tôi chơi/tạm dừng nhiều lần khi ứng dụng của tôi là ở chế độ nền, tôi báo cáo lỗi cho Apple và hy vọng sẽ nhận được một amswer sớm, tôi muốn biết nếu mã của tôi là sai hoặc có vấn đề về API. Nếu đây là lỗi bạn đang gặp phải, điều này có thể hữu ích. Tôi đến một cách giải quyết mà mặc dù isnt giải pháp tốt nhất, cho ứng dụng của tôi là chấp nhận được:

Trong viewDidLoad, thêm này:

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

Sau đó, tạo một phương pháp handle_ApplicationDidBecomeActive, và thêm điều này:

- (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]; 
    } 
} 

(không đặt mã này trong phương pháp playbackStateDidChanged của bạn vì điều này có thể tạo ra một vòng lặp vô tận)

này sẽ đồng bộ tình trạng yo các nút ur và trình phát nhạc đến nút được báo cáo bởi API. trong các trường hợp có trùng hợp ngẫu nhiên, sẽ không có tác động của bất kỳ loại nào, trong các trường hợp khác, người chơi sẽ tạm dừng/chơi tương ứng.

0

Tôi gặp phải sự cố tương tự với bản phát hành iOS 5. Tôi phát hiện thấy thuộc tính playbackState không được cập nhật, nhưng sau khi trì hoãn, vì vậy nó chưa được đặt khi phương thức playbackStateDidChanged của bạn chạy.

Cách giải quyết của tôi là đặt biến mẫu của riêng tôi được gọi là musicPlayerRecentlyStartedPlaying bất cứ khi nào tôi bắt đầu phát lại. Sau đó, tôi sử dụng một phương pháp gọi từ một bộ đếm thời gian để kiểm tra cả hai rằng biến và tài sản playbackState để tìm hiểu xem các cầu thủ thực sự chơi:

- (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; 
    } 
} 

Bạn có thể không cần phải gọi updateMusicControls từ một bộ đếm thời gian, nhưng tôi làm vì Tôi cũng đang cập nhật vị trí của thanh tiến trình khi nhạc phát.

+0

Bất kể tôi đợi đến bao lâu kiểm tra trạng thái phát lại, nó sẽ không chính xác cho đến khi tôi tạm dừng/khởi động lại trong khi ứng dụng của tôi đang hoạt động. –

+0

Mã của tôi giả định bạn chỉ đang phát và tạm dừng nhạc từ trong ứng dụng. Tôi không nghĩ rằng câu hỏi ban đầu được đề cập đến hoạt động nền, mặc dù các câu trả lời khác đang đề cập đến kịch bản đó. – arlomedia

+0

Kịch bản khiến tôi đau đầu nhất là người rời khỏi ứng dụng để thay đổi bài hát. Mặc dù bài hát mới hiện đang phát, trạng thái thông báo và phát lại được cung cấp cho ứng dụng sẽ cho biết bài hát bị tạm dừng. –

3

Không cách giải quyết nào trong số này giải quyết được vấn đề cho ứng dụng của tôi. Đó là lỗi trong iOS và ứng dụng của tôi sẽ không bao giờ hoạt động bình thường cho đến khi Apple sửa lỗi.

Tôi có trình phát nhạc có nút phát/tạm dừng. Khi nhạc đang phát, nút này hiển thị biểu tượng "tạm dừng". Khi nhạc bị tạm dừng, nút sẽ hiển thị biểu tượng "phát" - giống như tất cả các ứng dụng nhạc. Tôi có thể sao chép lỗi bất kỳ lúc nào bằng cách thực hiện như sau: 1. Phát nhạc trong ứng dụng của tôi (nút phát/tạm dừng hiển thị biểu tượng "tạm dừng" chính xác) 2. Nền ứng dụng của tôi và khóa điện thoại của tôi trong ~ 10 phút 3. Nhấn đúp vào nhà và nhấn nút tạm dừng từ các điều khiển của iPod 4. Mở khóa điện thoại của tôi và mở lại ứng dụng 5. Nhạc sẽ bị dừng, nhưng ứng dụng của tôi vẫn hiển thị biểu tượng "tạm dừng" khi quá "play"

Tôi đã thực hiện gỡ lỗi và ghi nhật ký rộng rãi để đảm bảo rằng phương thức cập nhật nút phát/tạm dừng của tôi luôn được gọi khi ứng dụng của tôi hoạt động. Vấn đề là khi tôi nhập lại ứng dụng của mình, trạng thái phát lại của MPMusicPlayer vẫn được đặt thành MPMusicPlaybackStatePlaying ngay cả khi nhạc bị dừng/tạm dừng.

Tôi đã gửi báo cáo lỗi cho điều này khoảng một năm trước và chưa nghe thấy bất kỳ điều gì từ Apple. Nếu một người nào khác sẽ nộp nó, nó sẽ được đánh giá cao.

4

Tôi cũng đã báo cáo lỗi này cho Apple. Tôi đã có thể tạo lại nó 100% thời gian bằng cách thực hiện như sau:

Khởi chạy ứng dụng sử dụng MPMusicPlayerController. Khởi chạy ứng dụng "Âm nhạc". Nhấn Phát, Bỏ qua, Bỏ qua, Tạm dừng, Phát, Tạm dừng Mở ứng dụng gốc và MPMusicPlaybackState của MPMusicPlayerController sẽ không chính xác.

Không có giải pháp được đề xuất nào ở đây phù hợp với tôi. Các giải pháp đã làm việc là để theo dõi khi các lỗi đã xảy ra và cập nhật giao diện người dùng đặc biệt trong những trường hợp này.

Khi thông báo UIApplicationDidBecomeActiveNotification nhận được (xem bài matbur để biết thêm chi tiết về vấn đề này), xem nếu âm thanh thực sự là không chơi khi MPMusicPlaybackState nói đó là:

-(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; 
} 

Đừng quên để import AudioToolbox khuôn khổ.

+0

Và tôi nên làm gì với thông tin này? Làm cách nào để tôi có được trạng thái chính xác? Hoặc làm cách nào tôi có thể đặt lại trình phát? – MetaImi

+0

Tôi đã hiểu. Nếu audioIsPlaying là đúng, thì bạn có thể sử dụng phương thức tạm dừng trình phát nhạc để tạm dừng nhạc, ngay cả khi nó có trạng thái sai. Và ngược lại. Vì vậy, với đoạn mã này, bạn có thể sửa chữa mpmusicplayercontroller – MetaImi

0

Mã này sử dụng khi nút trước nhấp Bài hát trước đó sẽ được chơi

- (IBAction)playPreviousSongInList:(id)sender { 

     static NSTimeInterval skipToBeginningOfSongIfElapsedTimeLongerThan = 3.5; 

     NSTimeInterval playbackTime = self.musicPlayer.currentPlaybackTime; 
     if (playbackTime <= skipToBeginningOfSongIfElapsedTimeLongerThan) { 

      [self.musicPlayer skipToPreviousItem]; 

     } else { 

      [self.musicPlayer skipToBeginning]; 
     } 
    }