您的位置:首页 > 移动开发 > 微信开发

反复拨打电话,电话测试小程序,紧急电话与普通电话分枝判断

2012-03-29 12:25 471 查看
          手机立将要上市了,狠是兴奋!

          写了个小程序(十分简单)给测试人员用,自己也测测自己负责的Phone到目前为止,进行暴风雪测试还有些什么问题?

          在写程序时遇到一个问题,本应该测试10086拨打测试,但由于要测试的机器有多部,没有那么多的sim卡,故想到拨打紧急电话来进行测试,如112

          但由于:紧急电话与普通电话分枝的不同,给自己带来一个问题,拨打紧急电话112,给跑到其它activity中,拨打不成功。现分析下为什么会出现这情况,也请各位给出更好地解决拨打112紧急电话的访问方式:

         在上次提到的:利用服务实现电话监听-来电-接听-挂断,进行录音中有监听电话胡程序,故我们可以利用监听电话的方式来实现此小测试程序

        1.在CALL_STATE_IDLE无状态(即空闲状态),可以进行电话的拨打,可以适当sleep几秒钟

         2.CALL_STATE_OFFHOOK 接通电话(即挂起),可以进行电话结束,可以适当sleep几秒钟

         3.CALL_STATE_RINGING 电话进来(即来电时)

 通过上面的想法是可以实现电话地反得拨打,反复挂断。见部分如下代码:

        1. 实现电话监听:

private TelephonyManager telMgr;

private ITelephony ITel;

telMgr = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);

telMgr.listen(new TeleListener(),PhoneStateListener.LISTEN_CALL_STATE);

        2.实行电话监听的代码:

   

class TeleListener extends PhoneStateListener {

@Override

public void onCallStateChanged(int state, String incomingNumber) {

super.onCallStateChanged(state, incomingNumber);

switch (state) {

case TelephonyManager.CALL_STATE_IDLE: {

try {

// getDial();

Thread.sleep(10000);             //睡10s

speedDial("10086");             //或112

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

break;

}

case TelephonyManager.CALL_STATE_OFFHOOK: {

Class<?> c = null;

try {

Thread.sleep(10000);    //睡10s

c = Class.forName("android.telephony.TelephonyManager");

Method m = c.getDeclaredMethod("getITelephony");

m.setAccessible(true);

ITel = (ITelephony) m.invoke(telMgr);

ITel.endCall();        //10s后进行挂断

} catch (SecurityException e) {

e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

break;

}

case TelephonyManager.CALL_STATE_RINGING: {

break;

}

default:

break;

}

}

}


3.之所以拨打非紧急电话时是正常,而拨打紧急电话,则会跑到其它的程序中去,问题就出在如下使用的intent中,但又用什么胡访问方式能使紧急与非紧急电话都可以打呢?                       

public void speedDial(String s){

Intent phoneIntent = new Intent("android.intent.action.CALL",                 //可以拨打非紧急电话,有权限,由于紧急电话与非紧电话分枝不同,下面分析分枝所在地

Uri.parse("tel:" + s));

startActivity(phoneIntent);

//          Intent callIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED,Uri.fromParts("tel", s, null));    //如果利此方式进行访问,权限不够,在Phone以外不能进行访问

//           startActivity(callIntent);

}

 由于紧急电话与非紧电话分枝不同:

   见:android phone电话拨出上层java流程 的分析。可以得到在OutgoingCallBroadcaster.java中有:

   进行号码判断  

String action = intent.getAction();

String number = PhoneNumberUtils.getNumberFromIntent(intent, this);

// Check the number, don't convert for sip uri

// TODO put uriNumber under PhoneNumberUtils

if (number != null) {

if (!PhoneNumberUtils.isUriNumber(number)) {

number = PhoneNumberUtils.convertKeypadLettersToDigits(number);

number = PhoneNumberUtils.stripSeparators(number);

}

}

final boolean emergencyNumber = (number != null)

&& PhoneNumberUtils.isEmergencyNumber(number); 

 如果为紧急电话:

if (emergencyNumber) {

Log.w(TAG, "Cannot call emergency number " + number

+ " with CALL Intent " + intent + ".");

Intent invokeFrameworkDialer = new Intent();

// TwelveKeyDialer is in a tab so we really want

// DialtactsActivity. Build the intent 'manually' to

// use the java resolver to find the dialer class (as

// opposed to a Context which look up known android

// packages only)

invokeFrameworkDialer.setClassName("com.android.contacts",

"com.android.contacts.DialtactsActivity");

invokeFrameworkDialer.setAction(Intent.ACTION_DIAL);

invokeFrameworkDialer.setData(intent.getData());

if (DBG)

Log.v(TAG, "onCreate(): calling startActivity for Dialer: "

+ invokeFrameworkDialer);

startActivity(invokeFrameworkDialer);

finish();

return;

}

非紧急电话:

if (callNow) {

intent.setClass(this, InCallScreen.class);

if (DBG)

Log.v(TAG, "onCreate(): callNow case, calling startActivity: "

+ intent);

startActivity(intent);

}


PS:简单见apk:http://download.csdn.net/detail/wangqilin8888/4182853,安装之后直接进入拨打10086,修改代码中的speedDial("10086");可以打不同的号码,但要sim或usim卡,如果想要打紧急电话来进行测试,还没有想到更好的办法,你帮忙想想,谢谢。等着你!

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息