相手が電話に出たことを検知する方法

閲覧: 713 回
最初の未読メッセージにスキップ

エジエジ

未読、
2009/04/02 3:08:382009/04/02
To: 日本Androidの会
Androidアプリ開発中の者です。

電話のステータスは
  IDLE
  OFFHOOK
  RINGING
があると認識してますが、電話をかけたときに「相手が出たこと」を検知する方法が見つかりません。

ご存じの方がいましたら、ご教示をお願いしたく存じます。

よろしくお願いします。

江島)

Keiji Ariyama

未読、
2009/04/06 3:32:112009/04/06
To: android-g...@googlegroups.com
エジエジさん

 有山@大阪です。

> 電話のステータスは
>   IDLE
>   OFFHOOK
>   RINGING
> があると認識してますが、電話をかけたときに「相手が出たこと」を検知する
方法が見つかりません。

 実際にやってみました。

 結論から言えば、発信時に「相手が出たこと」も、同じくPhoneStateListener
でOFFHOOKを取ることで検知すれば良いようです。

 着信時は、
IDLE -> RINGING -> OFFHOOK -> IDLEと言う流れになりますが、発信時には
IDLE -> OFFHOOK -> IDLEとなり、RINGINGの状態が無い事で判別が可能のようです。

--
有山圭二

M.Ejima

未読、
2009/04/06 7:05:222009/04/06
To: android-g...@googlegroups.com、M.Ejima
有山さん
江島です

アドバイスありがとうございます

いままでは BroadcastReceiver で試してましたが、今度は PhoneStateLinstenerでも
試してみます。

よろしくお願いします。

江島)

Keiji Ariyama

未読、
2009/04/06 7:17:392009/04/06
To: android-g...@googlegroups.com
江島さん

 有山@大阪です。

> いままでは BroadcastReceiver で試してましたが、今度は
PhoneStateLinstenerでも
> 試してみます。
 実を言えば、僕も最初はBroadcastReceiverについて検討しました。

 具体的に言えば、BroadcastReceiverで、発信時の
android.intent.action.NEW_OUTGOING_CALLを受けて、なんらかの処理をすると
いうものです。

 実際にやってみる上で、BroadcastReceiverの中でPhoneStateListenerを使っ
てイベントを受けるやり方にたどり着き、結局、BroadcastReceiverは要らない
よね。って結論に達しました。

 ちなみに最初、AndroidManifest.xmlのuses-permissionに、
android.permission.PROCESS_OUTGOING_CALLSを追加して無かったので発信をう
まく取ることが出来ず、しばらくはまっていました。

 宜しくお願い致します。

/*********************************************
有限会社シーリス
代表 有山 圭二
@Address
〒530-0044
大阪市北区東天満二丁目2番5号
第2新興ビル 601
@Web http://www.c-lis.co.jp
*********************************************/

M.Ejima

未読、
2009/04/07 5:59:382009/04/07
To: android-g...@googlegroups.com、M.Ejima
有山さん
江島です

まだテストコードで試していないので恐縮ですが。

>>> 発信時には
>>> IDLE -> OFFHOOK -> IDLEとなり、RINGINGの状態が無い事で判別が可能のようです。


ここのステータス変化に関して、教えていただけますか

最初のIDLEは、電話をかける前ですよね?

標準Dialerで番号入力し、CALLボタンを押すとOFFHOOKにステータスが変化しますね。
この状態で相手機の電話ベルがなると思うのですが、次に相手が電話に出ると、どの
ステータスに変化するのかを教えてもらえるとありがたいです。



最初に書くべきだったのですが、わたしがやりたい動作は、
  標準Dialerで電話をかけ、相手が出たらxxxを行うこと
で、その契機を知る手段を探しております。

よろしくお願いします。

江島)

Keiji Ariyama

未読、
2009/04/07 6:51:472009/04/07
To: android-g...@googlegroups.com
江島さん

 有山@大阪です。

> ここのステータス変化に関して、教えていただけますか
>
> 最初のIDLEは、電話をかける前ですよね?
 いえ、どうやら相手が出るまでは、OFFHOOKにならずIDLEのようですよ。

 エミュレータの上でしか実験していないのですが、

1.BroadcastReceiverでandroid.intent.action.NEW_OUTGOING_CALLを受ける
2.onReceive(Context arg0, Intent arg1)内でPhoneStateListenerを登録
3.標準のDialerで発信動作
4.onCallStateChanged(int state, String incomingNumber)で取れる値を観察

 この手順で、標準Dialerから発信すると、
IDLE -> OFFHOOK(相手が出た) -> IDLE になっています。

 少なくとも番号を入力して発信ボタンを押すまでは、BroadcastReceiverの
onReceive()は実行されないはずですから、電話をかけた後、相手が出るまでは
にIDLE状態であると言う結論にたどり着いたと言う次第です。

 不安要素としては、エミュレーターで発信動作をするとすぐに相手が出てしま
うので目視では解りにくいというものがありますけど……。


> 最初に書くべきだったのですが、わたしがやりたい動作は、
>   標準Dialerで電話をかけ、相手が出たらxxxを行うこと
> で、その契機を知る手段を探しております。

 僕がサンプルとして作ったアプリは、「標準Dialerで電話をかけ、相手が出た
らToastでメッセージ表示を行うこと」と言うものです。

 お役に立てるのであれば、こちらで作ったプロジェクトをお渡しする事も可能
ですが、急場で作ったソースを公衆の面前に晒すのはなんですので、もし必要な
ら言って下さい。こっそり送ります。

有山圭二

M.Ejima

未読、
2009/04/08 0:34:572009/04/08
To: android-g...@googlegroups.com
有山さん
江島です、こんにちわ

すみませんが、甘えさせてください。

> ですが、急場で作ったソースを公衆の面前に晒すのはなんですので、もし必要な
> ら言って下さい。こっそり送ります。

ぜひ、お貸しください。


よろしくお願いします。

江島)ejim...@gmail.com

Keiji Ariyama

未読、
2009/04/08 5:31:042009/04/08
To: android-g...@googlegroups.com
江島さん

 有山@大阪です。
 こっそり渡すと言いましたけど、下記のURLにアップロードしておきました。

http://www.c-lis.co.jp/calltester.zip

 インストールしてから電話をかけると、"You can speak."と言うメッセージが
Toastで表示され、電話を切ると、"Good bye."と、表示されるはずです。

 何かのお役に立てれば幸いです。

--
有山 圭二

M.Ejima

未読、
2009/04/09 0:37:392009/04/09
To: android-g...@googlegroups.com
有山さん
江島です

大変にありがとうございます
今週末に、さっそく試したいと思います。
実機もありますので、いろいろと実験できると思います。

本当にありがとうございます。

江島)

M.Ejima

未読、
2009/04/09 6:25:062009/04/09
To: android-g...@googlegroups.com
有山さん
江島です、大変にお世話になっております

実機で試しました。
電話機が呼び出しを始めた時点で、"Yes you can speak"が表示されてしまいます。
頂いたソースをいじりながら、もう少し探ってみます。

標準call画面では、相手が出た瞬間に "Call in progress" へと表示が変わるので、
なにかしら検知手段はあるはずなんですが。。。


よろしくお願いします。

江島)

Keiji Ariyama

未読、
2009/04/09 8:56:172009/04/09
To: android-g...@googlegroups.com
江島さん

 有山@大阪です。

> 実機で試しました。
> 電話機が呼び出しを始めた時点で、"Yes you can speak"が表示されてしまい
ます。
> 頂いたソースをいじりながら、もう少し探ってみます。
 あれ、本当だ。
 僕も実機で試してみたら通話が始まる前にyou can speakが表示されてしまい
ました。

 んー、他のPhoneStateListenerにも繋がった時のイベントは来ていないようで
すし……

 また時間が出来た時に、アプローチの方向を変えて試してみます。

Akio Kondo

未読、
2009/04/09 21:12:192009/04/09
To: 日本Androidの会
こんどうです。

横からすいません。
せっかくソースが公開されているので、
Phoneアプリの実装そのものを見てみました。

CallCard.javaで"Call in progress"にしているようです。
http://android.git.kernel.org/?p=platform/packages/apps/Phone.git;a=blob;f=src/com/android/phone/CallCard.java;h=710f1faa4a49ab063967b79915e1b6cfe1448c59;hb=HEAD

ここをみると
updateState
→updateForegroundCal
 →displayMainCallStatus
  →updateCardTitleWidgets
   →if (state == Call.State.ACTIVE) {

でCall in progressに変更しています。
updateState自体はInCallScreen.javaでコールされていて、
最終的には
com.android.internal.telephony.Phone
のパッケージが必要なようでした。

これは非公開APIらしく、
http://groups.google.com/group/android-kernel/browse_thread/thread/5794460ed009eedf
のやりとりによると、Androidのソースを落としてきてビルドすれば非公開APIを使用したアプリも作れるけど
今後変更がある可能性があるから使用するのはオススメできないと書いてあります。
まあでも電話関連の機能自体がなくなることはなさそうなので、
アプリのバージョンアップで対応すればよいような気もします。

相手が出たことを検知するには
他にも実現する方法があるかもしれませんけど、Phoneアプリではこうだったということで参考までに。

On 4月9日, 午後9:56, Keiji Ariyama <keiji_ariy...@c-lis.co.jp> wrote:
> 江島さん
>
>  有山@大阪です。
>
> > 実機で試しました。
> > 電話機が呼び出しを始めた時点で、"Yes you can speak"が表示されてしまい
> ます。
> > 頂いたソースをいじりながら、もう少し探ってみます。
>
>  あれ、本当だ。
>  僕も実機で試してみたら通話が始まる前にyou can speakが表示されてしまい
> ました。
>
>  んー、他のPhoneStateListenerにも繋がった時のイベントは来ていないようで
> すし......
>
>  また時間が出来た時に、アプローチの方向を変えて試してみます。
>
> /*********************************************
> 有限会社シーリス
> 代表 有山 圭二
> @Address
> 〒530-0044
> 大阪市北区東天満二丁目2番5号
> 第2新興ビル 601
> @Webhttp://www.c-lis.co.jp
> >>> 江島)ejima....@gmail.com
>
> >>> On 2009/04/07, at 19:51, Keiji Ariyama wrote:
>
> >>>> 江島さん
>
> >>>>  有山@大阪です。
>
> >>>>> ここのステータス変化に関して、教えていただけますか
>
> >>>>> 最初のIDLEは、電話をかける前ですよね?
> >>>>  いえ、どうやら相手が出るまでは、OFFHOOKにならずIDLEのようですよ。
>
> >>>>  エミュレータの上でしか実験していないのですが、
>
> >>>> 1.BroadcastReceiverでandroid.intent.action.NEW_OUTGOING_CALLを受ける
> >>>> 2.onReceive(Context arg0, Intent arg1)内でPhoneStateListenerを登録
> >>>> 3.標準のDialerで発信動作
> >>>> 4.onCallStateChanged(int state, String incomingNumber)で取れる値を観察
>
> >>>>  この手順で、標準Dialerから発信すると、
> >>>> IDLE -> OFFHOOK(相手が出た) -> IDLE になっています。
>
> >>>>  少なくとも番号を入力して発信ボタンを押すまでは、BroadcastReceiverの
> >>>> onReceive()は実行されないはずですから、電話をかけた後、相手が出るまでは
> >>>> にIDLE状態であると言う結論にたどり着いたと言う次第です。
>
> >>>>  不安要素としては、エミュレーターで発信動作をするとすぐに相手が出てしま
> >>>> うので目視では解りにくいというものがありますけど......。
> >>>>>> @Webhttp://www.c-lis.co.jp

Keiji Ariyama

未読、
2009/04/12 8:20:552009/04/12
To: android-g...@googlegroups.com
こんどうさん

 ありがとうございます!
 非公開APIでしたか。そろそろ手を出そうかと思っていた所ですが・・・

 ちなみに、現在のアプローチは、発信動作でサービスを起動して、着信履歴の
更新を監視する事で、相手への着信を取得できないかと言うものです。

有山

M.Ejima

未読、
2009/04/13 21:07:102009/04/13
To: android-g...@googlegroups.com
こんどうさん
江島です

アドバイスありがとうございます。
この非公開APIでのやりかたを試してみたいと思います。

ありがとうございました

江島)
全員に返信
投稿者に返信
転送
新着メール 0 件