電話通話発信⇒コール⇒相手が出る←ここを検知する方法を教えてください

2,976 views
Skip to first unread message

ほのかパパ

unread,
Apr 30, 2012, 7:36:50 AM4/30/12
to android-g...@googlegroups.com
honopapaと申します。

現在、電話で通話発信したあと相手がでた時の検知方法がわからず悩んでいます。
以前の投稿で
「相手が電話に出る検知方法」
があったのですが、最終的に非APIを使用してとなっていました
情報も2009年のものだったのでその後、違った方法がないかと投稿してみました。
PhoneStateListenerを使用して
IDLE(発信)⇒OFFHOOK(通話中)⇒IDLE(切断)でOFFHOOKのとき、相手がでるとなると思うのですが
IDLE(発信)⇒OFFHOOK(コール中)となり相手がでたときが検知できません。

どなたかよい方法をお教えください。よろしくお願いします。

Takahiro Shimokawa

unread,
May 7, 2012, 7:21:52 AM5/7/12
to android-g...@googlegroups.com
茨城支部の下川と申します。

別途honopapaさんからメールも頂きましたが、せっかくスレッドを立ててらっしゃるので、
こちらに返信させて頂きます。

自分で実験してみたいのですが、すぐに試せそうにないので、
リファレンスからの推測になってしまいますが、現状の状態変化は以下のようですよ。

IDLE(待機)→RINGING(発信)→OFFHOOK(通話中など)

イベントとしては、PhoneStateListener#onCallStateChangedだと思いますので、
ログを入れて確認してみるのが、早いかもしれませんね。

すでに試されていたら、ごめんなさい。


2012年4月30日月曜日 20時36分50秒 UTC+9 honopapa:

honopapa

unread,
May 9, 2012, 1:30:00 AM5/9/12
to android-g...@googlegroups.com
下川様
お返事ありがとうございます。

リファレンスからの推測になってしまいますが、現状の状態変化は以下のようですよ。

IDLE(待機)→RINGING(発信)→OFFHOOK(通話中など)

イベントとしては、PhoneStateListener#onCallStateChangedだと思いますので、
ログを入れて確認してみるのが、早いかもしれませんね。

すでに試されていたら、ごめんなさい。

PhoneStateListener#onCallStateChangedを試した結果

エミュレータ上
発信動作:IDLE(発信)→OFFHOOK(相手がでる)→IDLE(終了)
受信動作:RINGING(受信待機)→OFFHOOK(でる)→IDLE(終了)

エミュレータ上では発信後、すぐに相手がでる画面みたいなので確認ができない(本当に相手がでたときにOFFHOOKになっているか)

なので実機で確認してみると

実機上
発信動作:IDLE(発信)→OFFHOOK(発信?)→?(通話中)→IDLE(終了)
受信動作:RINGING(受信待機)→OFFHOOK(でる)→IDLE(終了)

通常、OFFHOOK(通話中など)で相手がでると検知するところ、発信の時に、IDLE→OFFHOOKとなってしましました

受信動作では、OFFHOOK(通話中など)は電話にでると検知し問題ありません(受け側の電話にでるものは)

今回行いたい動作として、「通常の標準電話発信(アプリからの発信ではない)で相手がでたら、XXXする」ということがしたかったのですが
「電話に相手がでた」ということが検知できません。

PhoneStateListener#onCallStateChangedの試し方がおかしいのでしょうか?
以下一部コードですが、各ステータス時にトーストで調べてみました

@Override
    public IBinder onBind(Intent intent){

return null;
}

//開始時
public void onStart(Intent intent,int startId){
super.onStart(intent, startId);
mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);

mTelephonyManager.listen(mPhoneStateListener,PhoneStateListener.LISTEN_CALL_STATE);
Toast.makeText(this, resultData, Toast.LENGTH_SHORT).show();

}

PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
   @Override
   public void onCallStateChanged(int state, String number) {
       phoneCallEvent(state, number);

      }
  };

  private void phoneCallEvent(int state, String number){
   switch(state) {
       /* 各状態でTextViewを追加する */
       case TelephonyManager.CALL_STATE_RINGING:
           /* 着信 */
       
        resultData="RINGING";
       
           break;

       case TelephonyManager.CALL_STATE_OFFHOOK:
           /* 通話 */
       
        resultData="OFFHOOK";

           break;

       case TelephonyManager.CALL_STATE_IDLE:
           /* 待ち受け */
       
        resultData="IDLE";
       
           break;
   };
}


 

ひでっぷ

unread,
May 9, 2012, 3:14:30 AM5/9/12
to android-g...@googlegroups.com
ひでっぷと申します。

下川さんのおっしゃられてる状態変化は受信時ではないでしょうか。
OFFHOOKとは受話器をあげることを意味しますので、発信時には発信する時点でOFFHOOKになると思います。

私も以前調べたのですが、「相手が出た」という状態は非公開APIでしか取得できなかったと思います。
MLの過去ログをあさると情報が出てくると思います。

2012年5月9日水曜日 14時30分00秒 UTC+9 honopapa:

honopapa

unread,
May 9, 2012, 3:51:57 AM5/9/12
to android-g...@googlegroups.com
ひでっぷ様

honopapaと申します。
お返事ありがとうございます。

  
私も以前調べたのですが、「相手が出た」という状態は非公開APIでしか取得できなかったと思います。
MLの過去ログをあさると情報が出てくると思います。


やはり、非公開APIですか

過去ログを調べてはいたのですが、下記過去ログで初めて非公開APIを知りました。

非公開APIも調べてはいるのですが、

com.android.internal.telephony.Phone
com.android.internal.telephony.ITelephony
com.android.internal.telephony.Call
・・・

いろいろとでてきて、いまいちどこをどのように使用したらいいのかわかりません。
非公開APIも知ったばかりなので使い方も勉強中でして・・・

どの部分を使用したらよいかご存知でしたら教えていただけないでしょうか。


************************
「相手が電話に出る検知方法」
以下、リンク先ログより
************************

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を使用したアプリも作れるけど 
今後変更がある可能性があるから使用するのはオススメできないと書いてあります。 
まあでも電話関連の機能自体がなくなることはなさそうなので、 
アプリのバージョンアップで対応すればよいような気もします。 

***********************************************


ひでっぷ

unread,
May 9, 2012, 9:54:45 AM5/9/12
to android-g...@googlegroups.com
ひでっぷです。
ぐぐると以下のサイトが出てきました。

ちなみに私は試しておりません。
(なんとなく非公開APIということで推奨されていない使い方なのかなと思いましたので)


2012年5月9日水曜日 16時51分57秒 UTC+9 honopapa:

honopapa

unread,
May 11, 2012, 3:16:52 AM5/11/12
to android-g...@googlegroups.com
ひでっぷ様
honopapaです

ぐぐると以下のサイトが出てきました。


情報ありがとうございます。
ここでは 
com.android.internal.telephony.ITelephony
を使用しての着信時横取りして切断するということでした

発信時は普通にBroadcastReceiver::onReceive内で"setResultData(null)"を呼び発信キャンセルだけでした
現在、非公開APIをいろいろ調べてはいるのですがやはり過去ログの
com.android.phone.CallCardが必要なのかなと調べています。
ただcom.android.phone.CallCardの使い方がわかりません
com.android.phone.CallCard内のupdateState自体はInCallScreen.javaで呼び出ししている(過去ログ、調べたら)とはわかったのですが・・・・
なのでcom.android.phone.InCallScreenを使うのか(使い方はわからないのですが;)

ClassLoader cl = getClassLoader();
Class<?> c = cl.loadClass("com.android.phone.CallCard");
と非公開APIのリフレクションしてとか・・・(使い方自体間違っているかもしれませんが)
クラスを呼び出してまではわかったのですが、その後どうしたらよいのかわからない状態です。
使い方をご存じでしたら教えていただけないでしょうか。(おんぶにだっこですみません)


Reply all
Reply to author
Forward
0 new messages