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

          手机立将要上市了,狠是兴奋!

          写了个小程序(十分简单)给测试人员用,自己也测测自己负责的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:简单见apkhttp://download.csdn.net/detail/wangqilin8888/4182853,安装之后直接进入拨打10086,修改代码中的speedDial("10086");可以打不同的号码,但要simusim卡,如果想要打紧急电话来进行测试,还没有想到更好的办法,你帮忙想想,谢谢。等着你!

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是使用Java语言编写的4皇后问题求解程序,采用分枝限界法: ```java public class NQueenProblem { private static int N = 4; // 皇后数量 private static int[] board = new int[N]; // 存储棋盘 // 判断当前位置是否安全 private static boolean isSafe(int row, int col) { // 检查列上是否有皇后 for (int i = 0; i < row; i++) { if (board[i] == col) { return false; } } // 检查左上角是否有皇后 for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { if (board[i] == j) { return false; } } // 检查右上角是否有皇后 for (int i = row - 1, j = col + 1; i >= 0 && j < N; i--, j++) { if (board[i] == j) { return false; } } return true; } // 分支限界法求解问题 private static boolean solveNQ(int row) { // 所有皇后已经放置完成,返回true if (row == N) { return true; } // 尝试放置皇后 for (int col = 0; col < N; col++) { if (isSafe(row, col)) { board[row] = col; // 递归下一行,如果成功,则返回true if (solveNQ(row + 1)) { return true; } // 如果失败,回溯 board[row] = -1; } } // 所有列都尝试过,仍然无法放置皇后,返回false return false; } // 打印棋盘 private static void printSolution() { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (board[i] == j) { System.out.print("Q "); } else { System.out.print(". "); } } System.out.println(); } } public static void main(String[] args) { // 初始化棋盘 for (int i = 0; i < N; i++) { board[i] = -1; } // 求解问题 if (solveNQ(0)) { printSolution(); } else { System.out.println("No solution found!"); } } } ``` 程序中使用了三个函数: - `isSafe(int row, int col)`:判断当前位置是否安全; - `solveNQ(int row)`:分支限界法求解问题; - `printSolution()`:打印棋盘。 在 `main` 函数中初始化棋盘并调用 `solveNQ` 函数,如果求解成功则调用 `printSolution` 函数打印棋盘,否则输出错误信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值