質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

解決済

1回答

2037閲覧

iPodtouch イヤフォンのプレイボタンによる遠隔制御

northpotato

総合スコア38

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

1クリップ

投稿2015/09/30 09:45

ios9, xcode7, Objective-C (iPodtouch 第6世代)の初心者です。
自作のアプリにて、画面上「スタート」「ストップ」のボタンを押して動作させているのですが、
そのかわりにイヤフォンのプレイボタンを押して、「スタート」を押したときと同じ動作を
させようとしています。 (加速度センサーから、デバイスの傾斜角を測定)
ネット上のサンプルコードを参考にして、下記のようなプログラムにしたのですが、
プレイボタンに反応してくれません。
ご教授頂けましたら、幸いです。 宜しくお願い致します。

// ViewController.m
#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()
{
// 変数の宣言、初期化

//メンバ変数として宣言
@public AVAudioPlayer *audio;
//モーションマネージャ
CMMotionManager *motionManager;
}

//メソッド宣言

  • (void)startAnimation;
  • (void)animation:(CMAccelerometerData *)data;
  • (void)remoteControlReceivedWithEvent:(UIEvent *)event;

@end

@implementation ViewController

#pragma mark -
#pragma mark setting for first responder

  • (void)viewDidLoad

{ [NSTimer
scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(update)
userInfo:nil
repeats:YES];

[super viewDidLoad]; [self startAnimation];

}

// 再生スイッチのファーストレスポンダになる

  • (BOOL)canBecomeFirstResponder

{
return YES;
}

  • (void)viewDidAppear:(BOOL)animated

{
[super viewDidAppear:animated];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
}

// ビューが表示されたらアニメーションをスタートする
// - (void)viewDidAppear:(BOOL)animated
// {
// [self startAnimation];
// }

// イヤフォンスイッチに対するアクション

  • (void)remoteControlReceivedWithEvent:(UIEvent *)event

{
if (event.type == UIEventTypeRemoteControl) {
switch (event.subtype) {
case UIEventSubtypeRemoteControlPlay:
// [start] ボタンを押したときの動作
{
self.judge_Label.textColor = [UIColor blackColor]; // "黒"
self.judge_Label.text = @"";
// 定期的に実行するハンドラを設定
CMAccelerometerHandler handler = ^(CMAccelerometerData *data, NSError *error){
[self animation:data];
};
// 加速度センサーの利用を開始
[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler:handler];

angle_R = 0; angle_L = 0; // 基準時間のセット NSDate *now =[NSDate date]; NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"HH:mm:ss"]; // self.Time_Label.text = [df stringFromDate:now]; [df setDateFormat:@"ss"]; s = [[df stringFromDate:now] intValue]; [df setDateFormat:@"mm"]; m = [[df stringFromDate:now] intValue]; [df setDateFormat:@"HH"]; s_m =s + 60*m; time_control = s_m; } break; case UIEventSubtypeRemoteControlPause: // 一時停止 break; case UIEventSubtypeRemoteControlStop: // 停止 break; case UIEventSubtypeRemoteControlTogglePlayPause: // 「Now Playing」の再生・一時停止から呼ばれる break; default: // UIEventSubtypeNone と UIEventSubtypeMotionShakeなので来ない break; } }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以前に参考にすると言っていた
http://uqtimes.blogspot.jp/2012/05/remotecontrolevnetsample.html
のサンプルプロジェクトで動作を確認してみましたか?

それを実行してみるとわかると思いますが、イヤホンの真ん中のボタンを
押して呼ばれるイベントは「UIEventSubtypeRemoteControlPlay」じゃなくて
「UIEventSubtypeRemoteControlTogglePlayPause」です。
イヤホンの真ん中のボタンは押すたびに再生/一時停止を繰り返すボタンですから。

標準のイヤホンのリモコンでは「UIEventSubtypeRemoteControlPlay」
は発生しないと思います。
おそらくこれは、標準でない別売りのリモコンイヤホンで
「再生」ボタンと「一時停止」ボタンが別々のボタンに
なっているような場合に呼ばれると思います。

それと、上記URLからリンクされているAppleの「イベント処理ガイド」
https://developer.apple.com/jp/documentation/EventHandlingiPhoneOS.pdf
にも書かれていますが、アプリケーションは「Now Playing」対応でなければ
ならず、遠隔制御イベントが届くのは、音声の再生が始まってからです。

なので、サンプルプロジェクトでやっているように音声を鳴らしてください。
別に音楽を鳴らす必要はなく、シャッター音のような短い効果音でいいです。

画面のボタンをタップするとボタンのイメージが変化してタップに
反応したことがわかるようになっているのと同様に、リモコンのボタンを
押したら、そのイベントが届いたことに対してシャッター音のような
短い音声で反応するのはユーザビリティ的にもやっておくべきだと思います。
アプリ起動時の最初の音声は別の起動音か無音の再生でもよいと思います。

投稿2015/09/30 16:48

編集2015/10/01 01:58
TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

northpotato

2015/10/01 20:06

TakeOne さん、回答、ありがとうございました。 //「UIEventSubtypeRemoteControlPlay」じゃなくて //「UIEventSubtypeRemoteControlTogglePlayPause」です。 //イヤホンの真ん中のボタンは押すたびに再生/一時停止を繰り返すボタンですから。 そうだったんですね。プログラムを改良し、UI---TogglePlayPause の部分に tgl_switch という変数をいれ(0に初期化)、スイッチを押す度に、この変数に1を足し、 奇数であれば、[start]処理、偶数であれば、[stop]処理するようにしました。  幾つか出てきたエラーをつぶしたのち、実機上で走らせてみましたところ、 なんと、イヤフォンの再生ボタンに反応して、start , stop を行っているではありませんか。 感動の瞬間でした。 この部分が、結構難関だったので、大きな一歩になりそうです。 Now playinng については、元々、傾斜が一定値を越したらアラームを鳴らすように してあったので、その部分は、問題なかったようです。 イヤフォンジャックを使ってしまって、アラーム音が聞こえなくなったので、bluetooth 対応の小さいスピーカーを注文しました。(実際にはbluetooth イヤフォンを使うことになるかと思いますが) また、実際使うのは、[再生ボタン]だけなので、もっと単純なリモコンがないか、アマゾンか何かで調べてみたいと思います。 何はともあれ、TakeOneさん、本当にありがとうございました。
TakeOne

2015/10/02 04:06

道が開けたようでよかったです。 > イヤフォンジャックを使ってしまって、アラーム音が聞こえなくなった とのことですが、イヤホンを耳につけずに再生ボタンだけ使っているのでしょうか? イヤホンを耳につけて使えば、全部聞こえると思いますよ。 本来このボタンはイヤホンに聞こえる音声を制御するためのボタンですので。 周囲に聞こえるように音を鳴らしたいなら、確かにスピーカーが必要かもしれませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問