Есть ли способ получить доступ к текущей воспроизводимой дорожке, когда iPhone подключен к аксессуару? - PullRequest
22 голосов
/ 06 февраля 2012

Я пытаюсь получить информацию о текущем воспроизводимом треке в приложении для iOS. Это работает довольно хорошо, в то время как iPhone не подключен к аксессуару. Если я подключу его к своей машине (Opel Astra, разъем для iPhone), следующий код перестанет работать , как описано в документации :

Если вы создаете музыкальный проигрыватель iPod, а пользователь воспроизводит элемент из другой библиотеки с помощью функции «Домашний обмен», значение этого свойства равно nil.

* * 1010

Код:

// nil while connected to an accessory
MPMediaItem *nowPlayingMediaItem =
                 [[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem];

// Works while not connected to an accessory
NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle];

Я даже пробовал такие "хакерские" вещи, как доступ к "частным" свойствам ( оригинальный код ):

MPMediaQuery *query=nil; 
MPMediaItemCollection *collection=nil; 
id internalPlayer=nil; 
Ivar internalPlayeriVar = object_getInstanceVariable(iPod, "_internal", NULL); 
internalPlayer = object_getIvar(iPod, internalPlayeriVar); 
NSLog(@"internalPlayer: %@", internalPlayer);
Ivar queryIvar = object_getInstanceVariable(internalPlayer, "_query", NULL); 
query = object_getIvar(internalPlayer, queryIvar); // nil everytime
Ivar collectionIvar = object_getInstanceVariable(internalPlayer, 
                                                 "_itemCollection", NULL); 
collection = object_getIvar(internalPlayer, collectionIvar); // nil everytime

или для вызова частных методов:

// Same behaviour like [iPod nowPlayingItem], works 
// only while no accessory is connected
MPMediaItem *nowPlayingMediaItem =
                 [iPod nowPlayingItemAtIndex:[iPod indexOfNowPlayingItem]];

// Works while not connected to an accessory
NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle];

Это также нет решения для доступа к новому MPNowPlayingInfoCenter, его nil все время.

[MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo

Моя машина воспроизводит мою музыку напрямую, без использования приложения для iPhone. и . Кажется, мой iPhone знает, что в данный момент играет машина, поскольку отображает заголовок, исполнителя и значок обложки на экране блокировки (и только там). ). Также увеличивается внутренний счет игры.

Если я проверяю состояние воспроизведения, возвращается также YES, если автомобиль воспроизводит музыку:

[[MPMusicPlayerController iPodMusicPlayer] playbackState] == MPMusicPlaybackStatePlaying 

Итак, есть ли какой-нибудь способ (может быть, через вызов приватных методов) для доступа к песне, машина в данный момент играет?

Ответы [ 4 ]

2 голосов
/ 13 февраля 2013

Apple просто «исправила это» в iOS 6.1 после того, как сообщила об этом как об ошибке.Следующий код теперь работает, когда мой iPhone подключен к моей машине:

MPMediaItem *nowPlayingMediaItem = [iPod nowPlayingItem];

NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle];

NSLog(@"Playing title: %@", title);

И что мне действительно нравится: Также можно изменить дорожку воспроизведения с помощью приложения iPod - приложение отображается так, как вы ожидаетеэто, вместо большого белого «подключенного к аксессуару» экрана.Так что это также может работать программно.

2 голосов
/ 23 февраля 2012

Вы используете темы?Если это так, запустите код в главном потоке.Если нет, зарегистрируйтесь для уведомлений MPMusicPlayerController для изменения элемента .Таким образом, когда песня изменится, ваше приложение узнает, что это за новая песня.Также убедитесь, что он работает в основном потоке .

Если ваше состояние воспроизведения обновляется во время подключения, а ваш nowPlayingItem нет, это подтвердит, что это ошибка.Я бы отправил отчет об ошибке для этой проблемы.

РЕДАКТИРОВАТЬ: Посетите https://developer.apple.com/support/resources/bug-reporting.html и прокрутите вниз.Последний вопрос говорит, что вы можете связаться с TSI для обхода ошибок.Вы получаете 2 запроса TSI на то, чтобы быть разработчиком бесплатно, поэтому вы можете использовать один из них, чтобы спросить их, есть ли у них обходной путь использования частной библиотеки, пока ошибка не будет исправлена.

0 голосов
/ 21 марта 2012

На самом деле вы не получите MPMediaItem, потому что ваш iPhone не воспроизводит песни, но аксессуар вашего автомобиля, подключенный к iPhone, получает доступ к библиотеке мультимедиа. При этом он отвечает за обновление всех метаданных объектов (песен), к которым осуществляется доступ, особенно за счет увеличения количества воспроизведения и обновления даты последнего доступа к песне. Кроме того, в библиотеке iTunes хранится некоторая информация о том, где находится песня (позиция).

Эта информация считывается с экрана блокировки для обновления обложки. Это также то, что помогает приложению iPod оставаться там, где оставлен аксессуар вашего автомобиля.

Так что нажмите на библиотеку и получите последнюю информацию оттуда. Чтобы начать, посмотрите пример проекта TopSongs.

0 голосов
/ 28 февраля 2012

Я почти уверен, что ответ отрицательный, вы не можете использовать хотя бы какие-либо общедоступные API, но вы должны сообщить об ошибке в apple по двум причинам:

Причина, по которой MPNowPlayingInfoCenter не предоставляет вам информацию,потому что это должно быть специально реализовано приложением, воспроизводящим музыку, если приложение Apple воспроизводит его, то это должно быть реализовано, поэтому сообщите об ошибке.

Теперь, если вы говорите [[MPMusicPlayerController iPodMusicPlayer] playState] отражает изменения воспроизведения, тоэто означало бы, что iPodMusicPlayer по-прежнему является приложением, отвечающим за воспроизведение, так что предоставление Apple нулевого значения для MPMediaItemPropertyTitle также должно быть сообщено в виде ошибки.

Кроме того, MFi, вероятно, не является публичной информацией по этой темеNDA и никто не собирается рисковать его задницей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...