iPhoneの外部ボタンを自分で機能させる方法

こんにちは、Habrの親愛なる読者!



かなり長い間、私はフリーランサーとして働いていました。時には、脳をアンロードするために100〜200ドルでいくつかの簡単なプロジェクトを取りました。 今回、クライアントから、iPhoneの外部ボリュームボタンを使用するように要求されました。 問題は、iOSの外部ボタン用の組み込みAPIが存在しないことでした。最近まで、システムの動作以外のデバイスのハードウェア要素の使用は禁止されていました。 そのため、「Camera +」や「Camera Pro」などのさまざまなアプリケーションでは、そのような機能をユーザーに伝えることができませんでした。 しかし、幸運なことに、iOS 5では、Apple開発者自身がインターフェースに対して同様のアプローチを使用し始めました。音量アップキーを押すことで、カメラのシステムアプリケーションで写真を撮ることができるようになりました。



アプリケーションで外部キーのこの動作を実装する方法については、catを参照してください。 ソースは記事の最後に添付されています。



タスクについて少しグーグルで説明すると、オーディオセッションを開いて音量の変化を聞き始めるオープンRBVolumeButtonsソリューションに出くわすことができます。 私の場合、このクラスはカメラに不快な影響を与えました。新しいオーディオセッションをアクティブにすることで、カメラのオーディオセッションを中断しました。 私は自分の自転車を組み立てることにし、わずかに異なる側面からプロセスにアプローチしました。 別のクラスNKVolumeButtonsを記述し、必要な機能をすべて隠します。



短い説明の後、組み込みのMediaPlayerフレームワークのMPMusicPlayerクラスを使用することにしました。 このクラスには、2つのシグルトン音楽プレーヤーがあります。1つはアプリケーション用で、もう1つは電話全体に共通のシステムです。 アプリケーションの音楽プレーヤーの音量の変化に耳を傾けます。 これを行うには、NKVolumeButtonsオブジェクトの初期化メソッドに小さなコードを追加します。



押して!
[[MPMusicPlayerController applicationMusicPlayer] addObserver:self forKeyPath:@"volume" options:NSKeyValueObservingOptionNew context:nil];
      
      





KVOの規範によると、すべて:独自の自転車の代わりに、NSObjectから継承された古き良きカテゴリを使用します。 したがって、イベントハンドラも必要です。リッスンしているパラメータが変更された場合、何らかの方法でこの情報を受け入れる必要があります。 メソッドをNKVolumeButtonsに自由に追加してください!



押して!
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { //    ,   keyPath  ;  ?   ,    -  volume [self checkVolumeButtons]; } - (void)checkVolumeButtons { // 1 float currentVolume = [[MPMusicPlayerController applicationMusicPlayer] volume]; // 2 if (currentVolume > 0.5) { [self volumeUp]; } else if (currentVolume < 0.5) { [self volumeDown]; } // 3 [[MPMusicPlayerController applicationMusicPlayer] setVolume:0.5]; }
      
      





コードを順番に分析してみましょう。



  1. 現在のアプリケーションボリュームを取得する
  2. ボリュームが増加したか減少したかを確認します
  3. ボリュームを元の値に戻します。


初期値は何ですか? 私が説明する:ユーザーがアプリケーションを入力し、ボリュームがゼロになったら? 次に、ボリュームダウンキーを押しても意味がありません。何も機能しません。 したがって、最初から音量を一定のレベルに設定する必要があり、そこから踊ります。 ボリュームパラメータは0〜1の値を取ることができるため、中間値-0.5を選択します。 NKVolumeButtonsオブジェクトの初期化に次のコードを追加します。



押して!
 [[MPMusicPlayerController applicationMusicPlayer] setVolume:0.5];
      
      





そして、メソッドvolumeUpとvolumeDownの実装を始めましょう。 便宜上、外部からアクセス可能な2つのパラメーターupBlockとdownBlockをNKVolumeButtonsクラスに追加します。 ファイルNKVolumeButtons.hを次の形式にします。



押して!
 typedef void (^ButtonBlock)(); #import <Foundation/Foundation.h> @interface NKVolumeButtons : NSObject @property (nonatomic, copy) ButtonBlock upBlock; @property (nonatomic, copy) ButtonBlock downBlock; @end
      
      





ここでは、ボリュームキーが押されたときに呼び出される外部からコードブロックをインストールする機能を簡単に追加しました。 パラメータの合成を忘れないでください。 NKVolumeButtons実装に次を追加します。



押して!
 @synthesize upBlock = _upBlock; @synthesize downBlock = _downBlock;
      
      





そして、もちろん、適切なタイミングでブロックを呼び出します。



押して!
 - (void)volumeUp { //   ,      if(self.upBlock) { self.upBlock(); } } - (void)volumeDown { //   ,      if(self.downBlock) { self.downBlock(); } }
      
      





そして、もう一つ問題があります! 音量を変更するたびに、画面に音量インジケータが表示されます。 さて、既にRBVolumeButtonsにあった既製のソリューションを使用します。 だからこそ、彼とオープンソースはお互いを助け合うのですか? 次のコードをNKVolumeButtons.mに追加します。



押して!
 //    CGRect frame = CGRectMake(0, -100, 10, 0); UIView *volumeView = [[MPVolumeView alloc] initWithFrame:frame]; [volumeView sizeToFit]; [[[[UIApplication sharedApplication] windows] objectAtIndex:0] addSubview:volumeView];
      
      





以上です! このクラスをプロジェクトに追加し、NKVolumeButtonsオブジェクトを初期化し、必要なコードブロックを設定するだけです。 この単純な松葉杖は、API外部キーがないという問題を解決します。



最後まで読んでくれてありがとう! ソースはgithubで入手できます。

突然不正確な点やタイプミスを見つけた場合は、 私の居心地の良い学習室ようこそ



All Articles