2012-03-20 4 views
0

Я уже спрашивал this question, но я чувствую, что должен начать новую нить, так как мой другой поток устарел и, вероятно, плохо сформулирован. Мне интересно, какой лучший подход был бы для добавления управления томом в приложение iOS, в основном молчание. Хорошим примером может быть навигационное приложение, которое воспроизводит только аудио, когда вы приближаетесь или пропустите поворот. В таком приложении, слушая подсказку поворота, которая не достаточно громкая, пользователь хотел бы, чтобы громкость для подсказок была слышимой, и, естественно, использовала бы регуляторы громкости для настройки подсказок по своему вкусу.Регулятор громкости в основном приложении Silent iOS

Здесь есть несколько проблем. Один из них заключается в том, что звук в настоящее время не воспроизводится, поэтому у пользователя нет ссылки на то, насколько он был увеличен. Это более или менее ожидаемое, но есть технические проблемы, которые меня больше интересуют. Чтобы связать сторонний регулятор громкости с вашим приложением, вам нужно запустить аудиозапись и управлять ею. Я не нашел авторитетной ссылки для такой ситуации, поскольку большинство документов предполагает, что вы в настоящее время играете или в процессе запуска аудио. Управление звуковым сеансом для практически бесшумного приложения кажется краеугольным камнем, хотя я считаю его довольно распространенным в том, что два из основных приложений, над которыми я работал, требуют такой функциональности.

Из-за различных проблем, связанных с управлением аудио-сеансом, вы должны решать проблему убийства и восстановления аудио сессии при перемещении и выходе из фона. Вы должны рассмотреть другие приложения, воспроизводящие аудио, когда вы начинаете и останавливаете сеанс. В зависимости от вашего типа приложения у вас могут быть другие более продвинутые потребности, такие как настраиваемая перенастройка маршрутизации на динамики, настраиваемые элементы управления отключением звука и т. Д. Если у вас есть какой-либо опыт работы с таким приложением, вы можете подробно рассказать о том, как вы решали такие проблемы и излагали другие вопросы?

+0

Вы посмотрели документацию iOS? Такое поведение четко определено в руководящих принципах взаимодействия с людьми, и они даже включают примеры реализации. –

+0

Ваш вопрос кажется слишком широким для этого формата Q & A, хотя по теме. – hotpaw2

ответ

0

Очень распространенный merhod - установить категорию аудиосеанса, соответствующую типу приложения при запуске, независимо от того, является ли звук имманентным или не будет воспроизводиться до завтрашнего дня (при условии, что цель и настройки приложения играть в такие).

Добавлено:

Один из способов, чтобы позволить пользователю регулировать громкость, когда приложение молчит, чтобы предоставить некоторые средства для пользователя, чтобы иметь приложение, чтобы немедленно начать (и/или, возможно, остановить), играя какой-нибудь звук с амплитудой, типичной для вашего приложения: какой-то калибровочный тон/разговор, ваше уведомление об авторских правах, звон товарного знака или сообщение безопасности, например.

+0

Вы путаете аудиосоединение с категорией аудио. Вы устанавливаете категорию для классификации приложения (например, VOIP, навигация и т. Д.). Apple рекомендует начать сеанс, прежде чем вы хотите воспроизвести аудио, что подчеркивает мой общий вопрос о том, как разрешить пользователю контролировать громкость, когда нет ничего играющего? – Cliff

0

Основная проблема, которую я вижу при разработке приложений, которые в основном молчат, касаются перемещения в/из переднего плана и хорошей игры с другим звуком. Чтобы лучше понять, что я обычно делаю, я дам несколько фрагментов из недавнего проекта. (Они преднамеренно неполны и предназначены только для иллюстрации точки.) Для аргумента предположим, что у нас есть класс AudioManager, который отвечает за поддержку сеансов аудио. Этот класс используется для создания пользовательского аудиоплеера. В таком классе мы поставили:

@interface MyAudioManager() 
@property (nonatomic, retain) BOOL alwaysMaintainAudioSession; 
@property (nonatomic, retain) MyCustomAudioPlayer *player; 
@end 

@implementation MyAudioManager 
@synthesize alwaysMaintainAudioSession; 
@synthesize player; 

-(void) applicationWillEnterForeground 
{ 
    isInBackground = NO; 
    if (NO==[self anyAudioIsPlaying] && self.alwaysMaintainAudioSession) { 
     [self activateAudioSession]; 
    } 
} 

-(void) activateAudioSession 
{ 
    AudioSessionSetActive(TRUE); 
    AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, AudioPropertyListener, self); 
} 

-(BOOL) anyAudioIsPlaying 
{ 
    return [self otherAudioIsPlaying] || [player isPlaying]; 
} 

-(BOOL) otherAudioIsPlaying 
{ 
    UInt32 yesNo; 
    UInt32 propertySize = sizeof(yesNo); 
    OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &propertySize, &yesNo); 
    if (kAudioSessionUnsupportedPropertyError == status) { 
     return MPMusicPlaybackStatePlaying == [theiPodMusicPlayer playbackState]; 
    } else { 
     return MPMusicPlaybackStatePlaying == [theiPodMusicPlayer playbackState] || yesNo; 
    } 
} 

менеджера позволяет установить свойство, которое всегда держит регулятор громкости, связанный с приложением звуками, которые означают, что мы всегда убедитесь, что либо сеанс активен или некоторые другие приложения играют аудио. В любом другом случае регулятор громкости возвращается к управлению звонком. Поэтому при входе на передний план мы должны проверять любое другое воспроизведение звука и условно активировать сеанс аудио. Также нам нужно закрыть сеанс при переходе на задний план, чтобы восстановить громкость звука звонка.

-(void) applicationDidEnterBackground 
{ 
    if (NO==[self anyAudioIsPlaying]) { 
     AudioSessionSetActive(NO); 
    } 
} 

В своем решении я включать кучу другого кода для обработки вещей, как реагировать разумно, когда Bluetooth аудио устройства подключены, фабричные методы для создания пользовательского проигрывателя, пользовательские сжатия аудио и многое другое.Основная идея, однако, заключается в обработке других приложений, воспроизводящих аудио, при попытке сохранить регулятор громкости, связанный с объемом приложения, на переднем плане.