코드 를 통 해 시스템 볼 륨 을 조정 하고 볼 륨 실체 버튼 사건 을 감청 합 니 다.

23147 단어 멀티미디어
다음으로 전송:http://www.vanbein.com/posts/ios%E8%BF%9B%E9%98%B6/2015/12/24/tong-guo-dai-ma-diao-zheng-xi-tong-yin-liang-,jian-ting-yin-liang-shi-ti-an-jian/#section-3  최근 프로젝트 는 감청 볼 륨 실체 키 를 사용 해 야 하 는 기능 이 있 으 며, 슬라이딩 애플 리 케 이 션 의 UISlider 를 통 해 시스템 볼 륨 을 조절 할 수 있 으 며, 그 중 많은 문제 가 발생 했 기 때문에 이 학습 과정 을 기록 합 니 다.
비록 AVPlayerAVPAudiolayer 이런 종류 가 음량 조절 기능 을 제 공 했 지만 이런 음량 제 어 는 앱 등급 의 제어 에 속한다.좋 은 점 은 볼 륨 조절 이 시스템 볼 륨 에 독립 되 어 큰 시간 동안 시스템 볼 륨 에 영향 을 주지 않 는 다 는 것 이다.그러나 때때로 우 리 는 소 리 를 조절 할 때 시스템 볼 륨 이 너무 작 으 면 앱 의 볼 륨 조절 효과 가 뚜렷 하지 않 지 않도록 시스템 볼 륨 을 수정 하고 싶 을 수도 있다.
1. 핸드폰 실체 볼 륨 버튼 감청
  • 감청 키보드 팝 업 과 유사 한 애플 은 이 알림 에 대한 감청 을 적당 한 곳 에 추가 하면 된다 는 통 지 를 제공 했다.
  • - (void)registeNotification{images
        //1.          ,            
        [[NSNotificationCenter defaultCenter] addObserver:self
        								selector:@selector(volumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];
        	//  UIApplication          ,    ,     
        	[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    }
    - (void)volumeChanged:(NSNotification *)notification{
        //2.       
        float volume = [[[notification userInfo] objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue];
        //do something here
    }
    - (void) removeNotification{
        //3.    
        [[NSNotificationCenter defaultCenter] removeObserver:self name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];
    }
    	//       
    	[[UIApplication sharedApplication] endReceivingRemoteControlEvents];

    비록 효과 가 있 지만 문제 가 생 겼 다
    \ # \ # \ # 1. 실체 키 를 눌 렀 을 때 시스템 의 '벨 소리' 가 나 고 '볼 륨' 을 표시 하고 싶 습 니 다.
    이 때 코드 를 추가 하면 이 페이지 에서 소리 대신 볼 륨 실체 키 를 누 르 면 볼 륨 을 표시 할 수 있 습 니 다.
    //          “  ”   ”  ”
    [[AVAudioSession sharedInstance] setActive:YES error:NULL];

    2. '볼 륨' 이 나 왔 지만 잠 금 화면, 백 스테이지 진입 등 으로 인해 ResignActive 가 다시 활성화 되면 '볼 륨' 이 아 닌 '벨 소리' 가 표 시 됩 니 다.
    이것 은 프로그램 이 백 엔 드 에 들 어간 후에 상기 코드 [AVAudio Session shared Instance] 가 더 이상 Active 상태 가 아니 기 때문에 AppDelegate.m 에 다시 설정 해 야 합 니 다. 그러면 '볼 륨' 에 계속 응답 할 수 있 습 니 다. 예 를 들 어:
     AppDelegate.m
    - (void)applicationWillEnterForeground:(UIApplication *)application {
          //        ,         “  ”   “  ”
          [[AVAudioSession sharedInstance] setActive:YES error:NULL];
    }

    3. 나 는 '볼 륨' 이 나 오고 싶 지 않다.
    이 럴 때 써 야 돼 요.  MPVolumeView  '볼 륨' 을 표시 하지 않 을 뿐만 아니 라 휴대 전화 볼 륨 설정 도 수정 할 수 있다.
    이 방법 은 애플 이 공식 적 으로 추천 한 방법 이다.MPVolumeView 는 Media Player Framework 의 UI 구성 요소 로 시스템 볼 륨 과 Airplay 장치 의 오디 오 미 러 경로 에 대한 제어 기능 을 직접 포함 합 니 다.볼 륨 을 조절 하기 위해 MPVolumeSlider 의 subview 를 포함 하고 있 습 니 다.이것 MPVolumeSlider 은 개인 클래스 입 니 다. 수 동 으로 만 들 수 없 지만, 이것 은 UISlider 의 하위 클래스 입 니 다.MPVolumeView 의 사용 은 간단 합 니 다. 부모 보기 에 넣 고 부모 보기 에 적당 한 크기 를 주 고 MPVolumeView 예제 를 만 들 고 부모 보기 에 넣 으 면 됩 니 다. 애플 공식 문서 에 예제 코드 가 있 으 면 참고 할 수 있 습 니 다.
  • 이 방법의 단점 은 다음 과 같다.
  • UI 는 맞 춤 형 제작 이 가능 한 정도 가 낮다.MPVolumeView 는 슬라이더 와 Route Button 의 스타일 을 맞 추 는 몇 가지 방법 만 제 한 된 방법 을 제공 하고 기본적으로 그림 을 바 꾸 어 해결 할 수 있 습 니 다.Slider 작업 을 Button 이나 다른 UI 구성 요소 로 바 꾸 려 면 불가능 합 니 다.
  • 별도의 볼 륨 제어 API 가 없다.지금까지 iOS 의 공개 API 에서 시스템 볼 륨 을 직접 조작 할 수 있 는 것 은 발견 되 지 않 았 기 때문에 시스템 볼 륨 을 수정 하려 면 이 UI 구성 요소 만 사용 할 수 있다.UI 에 제스처 동작 을 넣 어 볼 륨 을 조절 하려 면 MPVolumeView 를 직접 사용 하 는 것 은 불가능 하 다. 이 제한 을 피 할 수 있 는 방법 은 없 을 까?방법 은 있어.

  • 실제로 MPVolumeView 는 시스템 볼 륨 알림 을 표시 할 지 여 부 를 조절 하 는 인 터 페 이 스 를 제공 하지 않 았 다.그러나 우 리 는 MPVolumeView 가 현재 보기 의 등급 에 있 을 때 시스템 은 볼 륨 알림 을 표시 하지 않 는 다 는 것 을 발견 했다.그러면 일 은 하기 쉽다. 우 리 는 두 가지 만 확보 하면 된다.
  • MPVolumeView 보 기 는 화면 에 보이 지 않 는 곳 에 있 습 니 다. 예 를 들 어 불투명 한 보기 의 아래 나 본 보기 의 보이 지 않 는 구역 입 니 다. 흔히 볼 수 있 는 방법 은 이 보기 의 frame 을 구역 이외 의 곳 으로 설정 하 는 것 입 니 다. 예 를 들 어  volumeView.frame = CGRectMake(-1000, -100, 100, 100);
  • MPVolumeView 보기 의 hidden 속성 값 을 NO 로 확보 합 니 다.hidden 이 YES 일 때 도 알림 이 뜨 기 때문이다.


  • "볼 륨 알림 상자" 를 숨 기 려 면 다음 코드 를 추가 하면 됩 니 다.
    //  "     "
    //          `MediaPlayer.framework`
    MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(-100, -100, 100, 100)];
    volumeView.hidden = NO;
    [self.view addSubview:volumeView];

    코드 는 시스템 볼 륨 을 조절 하고 실체 버튼 을 통과 하지 않 습 니 다.
    위 에서 우 리 는 MPVolumeView 라 는 구성 요소 중 하나 인 subview 가 볼 륨 을 조절 하 는 것, 즉 MPVolumeSlider 를 언급 했다.따라서 우 리 는 MPVolumeView 인 스 턴 스 를 옮 겨 다 니 는 subviews 를 통 해 MPVolumeSlider 의 인 스 턴 스 를 얻 고 이 UI 구성 요 소 를 통 해 시스템 볼 륨 을 조작 할 수 있 습 니 다.
  • 절 차 는 다음 과 같다.
  • 1. MPVolumeView 만 들 기
  • 2. MPVolumeSlider 의 인 스 턴 스 를 찾 아 라
  • 3. volumeSlider.value 이 속성 을 통 해 현재 시스템 볼 륨 을 얻 을 수 있 습 니 다.
  • 4. 이 인 스 턴 스 는 setValue:animated: 방법 으로 시스템 볼 륨
  • 을 설정 합 니 다.
  • 5. 슬라이더 와 같은 사용자 정의 보 기 를 추가 합 니 다. 이 보 기 를 통 해 시스템 볼 륨 을 변경 합 니 다

  • 구체 적 인 코드 는 다음 과 같다.
    - (void)viewDidLoad {
        [super viewDidLoad];
    	//   “  ”,  “  ”
        [[AVAudioSession sharedInstance] setActive:YES error:NULL];
        //1.    MPVolumeView   ,
        MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(-100, -100, 100, 100)];
        //volumeView.hidden = NO;
        //[self.view addSubview:volumeView]; //      “  ”
        volumeViewSlider = nil;
        //2.   MPVolumeView subViews  MPVolumeSlider
        for (UIView *view in [volumeView subviews]){
            if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
                volumeViewSlider = (UISlider*)view;
                break;
            }
        }
        //3.      
        float systemVolume = volumeViewSlider.value;
        //4.        slider,           
        VolSlider = [[UISlider alloc] initWithFrame:CGRectMake(30, 200, 300, 20)];
        VolSlider.value = systemVolume;  //   
        [VolSlider setMinimumValue:0.0]; //   
        [VolSlider setMaximumValue:1.0]; //   
        [VolSlider addTarget:self action:@selector(sliderValueChange:) forControlEvents:UIControlEventValueChanged]; //    
        [self.view addSubview:VolSlider];
        //           
        [self registeNotification];
    }
    //
    //VolSlider    
    - (void)sliderValueChange:(UISlider *)slider{ 
        //         value
        float value = slider.value; 
        //        ,        0.0 - 1.0
        [volumeViewSlider setValue:value animated:NO];
        // setValue    ,
        [volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];
    }
    //
    //          ,    
    - (void)volumeChanged:(NSNotification *)notification{   
        //         
        float volume = [[[notification userInfo] objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue];
        //           
    	[VolSlider setValue:volume animated:YES];
    }

    VolSlider 를 설정 하면 시스템 의 볼 륨 알림 상자 와 동기 화 할 수 있 습 니 다. 효 과 는 다음 과 같 습 니 다.
    코드 github 링크 첨부: changesystemVolume

    좋은 웹페이지 즐겨찾기