无法捕获TelephonyManager.EXTRA_STATE_RINGING
写一个最简单的捕获电话状态的功能,但是在模拟器上测试通过,真机上只会进入idle
1 package com.example.contextawaredemo; 2 3 import android.app.Activity; 4 import android.app.Service; 5 import android.content.BroadcastReceiver; 6 import android.content.Context; 7 import android.content.Intent; 8 import android.content.IntentFilter; 9 import android.os.Bundle; 10 import android.telephony.PhoneStateListener; 11 import android.telephony.TelephonyManager; 12 import android.widget.Toast; 13 14 15 public class PhoneStatReceiver { 16 private static final String TAG = "PhoneStateReceiver"; 17 private static final String PHONE_STATE = "android.intent.action.PHONE_STATE"; 18 private static final String OUTGOING_CALL = "android.intent.action.NEW_OUTGOING_CALL"; 19 private static boolean incomingFlag = false; 20 BroadcastReceiver callReceiver; 21 SimplePost post=new SimplePost(); 22 static boolean addReceiver=false; 23 24 25 26 public void addReceiver(Activity act){ 27 addReceiver=true; 28 29 callReceiver = new BroadcastReceiver(){ 30 31 @Override 32 public void onReceive(Context context, Intent intent){ 33 // 34 System.out.println("in the onReceive funchion now ~~"); 35 System.out.println("flag is: "+ incomingFlag); 36 if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){ 37 incomingFlag = true; 38 System.out.print("call out"); 39 System.out.println("in the if flag is: "+ incomingFlag); 40 post.sendMessage("calling"); 41 }else{ 42 //TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE); 43 System.out.println("in the else flag is: "+ incomingFlag); 44 45 String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 46 System.out.println("state is:"+ state); 47 if(TelephonyManager.EXTRA_STATE_RINGING.equals(state)){ 48 System.out.println("ringing"); 49 incomingFlag=true; 50 System.out.println("a new call coming in"); 51 Toast.makeText(context, "new call come in", Toast.LENGTH_LONG).show(); 52 //calling 53 post.sendMessage("calling"); 54 } 55 if(TelephonyManager.EXTRA_STATE_IDLE.equals(state)){ 56 System.out.println("idle"); 57 if(incomingFlag){ 58 System.out.println("idle,not active now"); 59 Toast.makeText(context, "idle", Toast.LENGTH_LONG).show(); 60 //finished 61 post.sendMessage("finished"); 62 } 63 incomingFlag = false; 64 } 65 if(TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state)){ 66 System.out.println("OFF HOOK"); 67 if(incomingFlag){ 68 System.out.println("offhook"); 69 //in call 70 post.sendMessage("inCall"); 71 } 72 73 } 74 75 } 76 } 77 78 79 // switch (tm.getCallState()){ 80 // case TelephonyManager.CALL_STATE_RINGING: 81 // incomingFlag=true; 82 // System.out.println("a new call coming in"); 83 // Toast.makeText(context, "new call come in", Toast.LENGTH_LONG).show(); 84 // //calling 85 // post.sendMessage("calling"); 86 // break; 87 // case TelephonyManager.CALL_STATE_OFFHOOK: 88 // System.out.println("out of offhook"); 89 // if(incomingFlag){ 90 // System.out.println("offhook"); 91 // //in call 92 // post.sendMessage("inCall"); 93 // } 94 // break; 95 // case TelephonyManager.CALL_STATE_IDLE: 96 // System.out.println("out of idle"); 97 // //just for test local - idle 98 // if(incomingFlag){ 99 // System.out.println("idle,not active now"); 100 // Toast.makeText(context, "idle", Toast.LENGTH_LONG).show(); 101 // //finished 102 // post.sendMessage("finished"); 103 // } 104 // incomingFlag = false; 105 // break; 106 // default: 107 // System.out.println("do nothing"); 108 // 109 // 110 // 111 // } 112 113 //TEST THE LISTENER 114 // tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); 115 // 116 // 117 // } 118 // 119 // 120 // } 121 // PhoneStateListener listener=new PhoneStateListener(){ 122 // @Override 123 // public void onCallStateChanged(int state,String incomingNumber){ 124 // super.onCallStateChanged(state, incomingNumber); 125 // switch(state){ 126 // 127 // case TelephonyManager.CALL_STATE_RINGING: 128 // System.out.println("in the switch call state ringing flag is: "+ incomingFlag); 129 // incomingFlag=true; 130 // System.out.println("a new call coming in"); 131 // //Toast.makeText(context, "new call come in", Toast.LENGTH_LONG).show(); 132 // //calling 133 // post.sendMessage("calling"); 134 // break; 135 // case TelephonyManager.CALL_STATE_OFFHOOK: 136 // System.out.println("in the switch call state offhook flag is: "+ incomingFlag); 137 // System.out.println("out of offhook"); 138 // if(incomingFlag){ 139 // System.out.println("offhook"); 140 // //in call 141 // post.sendMessage("inCall"); 142 // } 143 // break; 144 // case TelephonyManager.CALL_STATE_IDLE: 145 // System.out.println("in the switch call state idel flag is: "+ incomingFlag); 146 // System.out.println("out of idle"); 147 // //just for test local - idle 148 // if(incomingFlag){ 149 // System.out.println("idle,not active now"); 150 // //Toast.makeText(context, "idle", Toast.LENGTH_LONG).show(); 151 // //finished 152 // post.sendMessage("finished"); 153 // } 154 // //incomingFlag = false; 155 // break; 156 // 157 // } 158 // 159 // }}; 160 }; 161 162 System.out.println("add receiver in phoneStatReceiver"); 163 IntentFilter filter = new IntentFilter(); 164 filter.addAction(PHONE_STATE); 165 filter.addAction(OUTGOING_CALL); 166 if(this.callReceiver==null){ 167 System.out.println("call receiver is null"); 168 } 169 170 act.registerReceiver(callReceiver,filter); 171 // registerReceiver(callReceiver, new IntentFilter(PHONE_STATE)); 172 // registerReceiver(callReceiver, new IntentFilter(OUTGOING_CALL)); 173 System.out.println("add receiver finished"); 174 175 //test whether add success 176 // sendBroadcast(new Intent(PHONE_STATE)); 177 // System.out.println("test out going call"); 178 // sendBroadcast(new Intent(OUTGOING_CALL)); 179 } 180 181 182 public void DestroyReceiver(Activity act){ 183 if(addReceiver){ 184 act.unregisterReceiver(callReceiver); 185 System.out.println("destroy receiver finished");} 186 else{ 187 System.out.println("nothing to destroy"); 188 } 189 } 190 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.contextawaredemo" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk 8 android:minSdkVersion="8" 9 android:targetSdkVersion="17" /> 10 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 11 <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> 12 <uses-permission android:name="android.permission.CALL_PHONE"/> 13 14 15 <uses-permission android:name="android.permission.INTERNET"/> 16 17 <application 18 android:allowBackup="true" 19 android:icon="@drawable/ic_launcher" 20 android:label="@string/app_name" 21 android:theme="@style/AppTheme" > 22 <!-- <receiver android:name="PhoneStatReceiver"> --> 23 <!-- <intent-filter> --> 24 <!-- <action android:name="android.intent.action.PHONE_STATE"/> --> 25 <!-- <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> --> 26 <!-- </intent-filter> --> 27 <!-- </receiver> --> 28 <activity 29 android:name="com.example.contextawaredemo.MainActivity" 30 android:label="@string/app_name" > 31 <intent-filter> 32 <action android:name="android.intent.action.MAIN" /> 33 34 <category android:name="android.intent.category.LAUNCHER" /> 35 </intent-filter> 36 </activity> 37 </application> 38 39 </manifest>
这个是不完整的代码 工程的一部分
关键是android 的版本。我原本写的是14到17仅为了配合switcher,但是broadcast却出现了问题。改到8就O.K.了。我的模拟器是4.2.2 真机是4.1.2 SDK是4.2.2
再来么,我发现网上是会以讹传讹的,之前我写的(可以看我注释掉的两部分)一是用了TelephonyManager 其实不必要,因为既然已经用了Broadcast 用context来甄别不同的状态就不用tm了。
另外后面的注释掉部分用了listener 越高越复杂。http://stackoverflow.com/questions/6036295/not-able-to-get-the-telephonymanager-call-state-ringing
另外的话,此应用还碰到一个头疼的问题上面代码没有反映就是连接网络连不上,后来发现是只针对特定端口如3456 改个8080什么的就好了。