隨筆-1  評論-68  文章-98  trackbacks-0

          待機/主屏界面輸入數字1~9后跳轉到了聯系人界面。
           
          待機規則:如果輸入的是0~9或者+*#,會切換到撥號界面;輸入其它字符,則切換到聯系人界面。
          原因分析:模擬器輸入1~9,看到的是1~9;手機鍵盤輸入1~9,實際輸入的是.adgj...。可以在寫信窗口驗證鍵盤輸入。
          解決方法:在待機程序中添加keyCode的處理,如果keyCode的值是KeyEvent.KEYCODE_0~KEYCODE_9或者KeyEvent.KEYCODE_STAR、KeyEvent.KEYCODE_POUND、KeyEvent.KEYCODE_PLUS,轉換成對應的是0~9或者+*#,其它流程不變。另外,模擬器的*和#的keyCode值與10個數字的keyCode值重疊(電腦鍵盤傳輸造成的,手機鍵盤不存在這個問題),這塊也需要作特殊處理。
          代碼如下:

          public final class com.android.launcher.Launcher
          {
          ……

              public final static String KEY_STAR  = "*";
              public final static String KEY_POUND = "#";
              public final static String KEY_PLUS  = "+";
             
              @Override
              public boolean onKeyDown(int keyCode, KeyEvent event) {
                  boolean handled = super.onKeyDown(keyCode, event);
                  if (!handled && keyCode != KeyEvent.KEYCODE_ENTER) {
                      boolean gotKey = TextKeyListener.getInstance().onKeyDown(mWorkspace, mDefaultKeySsb,
                              keyCode, event);
                      if (gotKey && mDefaultKeySsb != null && mDefaultKeySsb.length() > 0) {
                          // something usable has been typed - dispatch it now.
                          String str = mDefaultKeySsb.toString();
                          boolean isDialable = true;
                          //for emunlator
                       if ( keyCode >= KeyEvent.KEYCODE_0 && keyCode<= KeyEvent.KEYCODE_9 )
                       {
                        if ( ! KEY_STAR.equals( str ) && ! KEY_POUND.equals( str ) )
                        {//for emulator
                         str = String.valueOf( keyCode2Value(keyCode) );
                        }
                       }
                       else if ( keyCode == KeyEvent.KEYCODE_STAR )
                          {
                        str = KEY_STAR;
                          }
                       else if ( keyCode == KeyEvent.KEYCODE_POUND )
                          {
                        str = KEY_POUND;
                          }
                       else if ( keyCode == KeyEvent.KEYCODE_PLUS )
                          {
                        str = KEY_PLUS;
                          }
                       else
                       {
                           final int count = str.length();
                           for (int i = 0; i < count; i++)
                           {
                               if (!PhoneNumberUtils.isReallyDialable(str.charAt(i)))
                               {
                                   isDialable = false;
                                   break;
                               }
                           }
                       }
                          Intent intent;
                          if (isDialable) {
                              intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", str, null));
                          } else {
                              intent = new Intent(Contacts.Intents.UI.FILTER_CONTACTS_ACTION);
                              intent.putExtra(Contacts.Intents.UI.FILTER_TEXT_EXTRA_KEY, str);
                          }
                          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                          try {
                              startActivity(intent);
                          } catch (android.content.ActivityNotFoundException ex) {
                              // Oh well... no one knows how to filter/dial. Life goes on.
                          }
                          mDefaultKeySsb.clear();
                          mDefaultKeySsb.clearSpans();
                          Selection.setSelection(mDefaultKeySsb, 0);
                          return true;
                      }
                  }
                  return handled;
              }
             
              private int keyCode2Value( int keyCode )
              {
               switch ( keyCode )
               {
                case KeyEvent.KEYCODE_0:
                 return ToneGenerator.TONE_DTMF_0;
                
                case KeyEvent.KEYCODE_1:
                 return ToneGenerator.TONE_DTMF_1;
                
                case KeyEvent.KEYCODE_2:
                 return ToneGenerator.TONE_DTMF_2;
                
                case KeyEvent.KEYCODE_3:
                 return ToneGenerator.TONE_DTMF_3;
                
                case KeyEvent.KEYCODE_4:
                 return ToneGenerator.TONE_DTMF_4;
                
                case KeyEvent.KEYCODE_5:
                 return ToneGenerator.TONE_DTMF_5;
                
                case KeyEvent.KEYCODE_6:
                 return ToneGenerator.TONE_DTMF_6;
                
                case KeyEvent.KEYCODE_7:
                 return ToneGenerator.TONE_DTMF_7;
                
                case KeyEvent.KEYCODE_8:
                 return ToneGenerator.TONE_DTMF_8;
                
                case KeyEvent.KEYCODE_9:
                 return ToneGenerator.TONE_DTMF_9;
                case KeyEvent.KEYCODE_STAR://*
                 return ToneGenerator.TONE_DTMF_P;
                
                case KeyEvent.KEYCODE_POUND://#
                 return ToneGenerator.TONE_DTMF_S;
                
                case KeyEvent.KEYCODE_PLUS://+
          //       return ToneGenerator.;
               
                default:
                 return 0;
               }
              }
          ……
          }


          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/netpirate/archive/2009/06/26/4300157.aspx

          posted on 2009-08-29 23:29 Xu Jianxiang 閱讀(530) 評論(0)  編輯  收藏 所屬分類: Android
          主站蜘蛛池模板: 鲜城| 嘉黎县| 张北县| 新疆| 辽宁省| 甘南县| 天柱县| 博罗县| 酒泉市| 安岳县| 应用必备| 崇文区| 中方县| 襄城县| 大理市| 洪江市| 阜阳市| 望都县| 会理县| 南平市| 司法| 新丰县| 广宗县| 蕉岭县| 买车| 旌德县| 陆川县| 富川| 沈丘县| 荔波县| 佛学| 利辛县| 武鸣县| 吴旗县| 武邑县| 永济市| 汤原县| 海宁市| 慈溪市| 白山市| 辉南县|