Получите доступ к музыкальной библиотеке iPod и отобразите список звуков с длиной

Я пытаюсь получить доступ к музыкальной библиотеке iPod и после этого создать локальное уведомление, когда мое приложение находится в фоновом режиме. Я хочу воспроизвести выбранный звук в локальном уведомлении. Моя проблема в том, что Apple разрешает только те файлы, которые меньше 30 секунд. в длину.

Итак, есть ли способ получить список только тех звуков, длина которых составляет менее 30 секунд?

Если я получу этот список, мне нужно скопировать выбранный медиафайл в мой пакет ресурсов. Затем я могу отправить его в свое локальное уведомление. до тех пор, пока и если нет никакого способа передать элемент мультимедиа непосредственно локальному уведомлению.

Спасибо всем за помощь..


person Kapil Choubisa    schedule 19.06.2011    source источник
comment
Вы не можете писать в свой пакет приложений, последний раз, когда я проверял.   -  person tc.    schedule 20.06.2011
comment
blog.tapsquare.com/post/803301658/ipod-library-access Эта ссылка говорит, что это возможно, но ничего не говорит о том, как этого добиться   -  person Kapil Choubisa    schedule 20.06.2011
comment
Вы по-прежнему не можете писать в свой пакет приложений, так как это нарушит подпись кода (и в любом случае это довольно плохая практика). Вы можете писать в каталоги Library, Documents и temp (и есть много примеров того, как получить пути к ним), но неясно, можете ли вы воспроизводить эти звуки из уведомлений (вы можете попробовать путь вроде ../Library/Application Support/MyApp/MySound.mp4 или любой другой). , но его надежная работа не гарантируется). Обратите внимание, что каталог «Документы» является традиционным, но доступен для обмена файлами iTunes; вы, вероятно, хотите что-то в библиотеке.   -  person tc.    schedule 22.06.2011
comment
Здравствуйте @TC, не могли бы вы переместить свой комментарий в ответ, чтобы я мог пометить его как правильный.   -  person Kapil Choubisa    schedule 06.04.2013


Ответы (1)


Предполагая, что вам нужны элементы только под «музыкой» (а не подкасты или мелодии звонка), должно работать что-то вроде этого:

MPMediaQuery * query = [MPMediaQuery songsQuery];
NSArray * items = [query items];
NSPredicate * predicate = [NSPredicate predicateWithBlock:
   ^(id evaluatedObject, NSDictionary *bindings){
     MPMediaItem * item = evaluatedObject;
     NSNumber * duration = [item valueForProperty:MPMediaItemPropertyPlaybackDuration];
     return [duration doubleValue] < 30;
   }];
NSArray * filteredItems = [items filteredArrayUsingPredicate:predicate];

К сожалению, MPMediaPropertyPredicate не позволяет нам фильтровать по «длительности менее 30 секунд» (типы сравнения «EqualTo» и «Contains»), поэтому мы делаем это вручную выше.

Затем нужно экспортировать нужный трек с помощью AVAssetExportSession. Вероятно, вам нужно преобразовать его в один из поддерживаемых форматов в Руководство по программированию локальных и push-уведомлений. Я также предлагаю использовать фиксированное имя файла, чтобы было легче отслеживать созданные вами файлы.

Наконец, вы не можете писать в свой пакет приложений, поскольку это делает подпись кода недействительной (очевидно, раньше вы могли это делать; возможно, подпись проверяется только во время установки). Однако вы можете использовать относительный путь, например ../Library/Application Support/MyApp/MySound.mp4.

Обратите внимание, что это не гарантирует работу и может привести к сбою проверки приложения! В частности,

  • Нет никакой гарантии, что путь будет начинаться с ../Library. Алгоритм создания относительных путей выходит за рамки этого ответа. (Абсолютный путь, вероятно, не будет работать, так как он не работает с -[NSString stringByAppendingPathComponent:].)
  • Нет никакой гарантии, что UILocalNotification.soundName примет путь; в документации просто говорится, что он принимает «имя файла (включая расширение) звукового ресурса в основном комплекте приложения».
person tc.    schedule 09.04.2013