pc(电脑)用java经过adb操做android手机发短信及中文乱码解决

最近想用java调用android手机的短信功能。已开始用一下方法实现:


adb -s emulator-5554 shell am start -a android.intent.action.SENDTO -d sms:5556 --es sms_body "hello"


adb -s emulator-5554 shell input keyevent 22   //切换焦点到发送按钮


adb -s emulator-5554 shell input keyevent 66  //单击


可是这种方法不能发送中文。


因而就想到把中文转换为Unicode编码,但默认的短信发送器不能把编码转换为中文。因此就想到本身写一个短信发送器,先把编码转为中文在发送出去。


所以代码以下:


一、短信发送器:


public class MainActivity extends Activity {


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Intent intent=this.getIntent();
        
        String mess=intent.getStringExtra("mes");  //接受信息内容编码
        if(mess!=null){
        String temp=Html.fromHtml(mess).toString();
       
        char[] convtBuf=new char[2];
        temp=loadConvert(mess.toCharArray(),0,mess.length(),convtBuf);//编码转换为中文
        
        String num=intent.getStringExtra("number");
        sendMess(temp,num);
        }
      
        this.finish();
        
    }
    
    //发送短信代码
    private int sendMess(String str,String number){
    SmsManager manager= SmsManager.getDefault();
    ArrayList<String> texts=manager.divideMessage(str);
    for(String text:texts){
    manager.sendTextMessage(number,null,text,null,null);
    }
   
    return 0;
   
    }
    
    //编码转换代码
        private static String loadConvert (char[] in, int off, int len, char[] convtBuf) {
            if (convtBuf.length < len) {
                int newLen = len * 2;
                if (newLen < 0) {
                newLen = Integer.MAX_VALUE;
            } 
            convtBuf = new char[newLen];
            }
            char aChar;
            char[] out = convtBuf; 
            int outLen = 0;
            int end = off + len;
     
            while (off < end) {
                aChar = in[off++];
                if (aChar == '\\') {
                    aChar = in[off++];   
                    if(aChar == 'u') {
                        // Read the xxxx
                        int value=0;
                for (int i=0; i<4; i++) {
                    aChar = in[off++];  
                    switch (aChar) {
                      case '0': case '1': case '2': case '3': case '4':
                      case '5': case '6': case '7': case '8': case '9':
                         value = (value << 4) + aChar - '0';
                     break;
                  case 'a': case 'b': case 'c':
                              case 'd': case 'e': case 'f':
                     value = (value << 4) + 10 + aChar - 'a';
                     break;
                  case 'A': case 'B': case 'C':
                              case 'D': case 'E': case 'F':
                     value = (value << 4) + 10 + aChar - 'A';
                     break;
                  default:
                                  throw new IllegalArgumentException(
                                               "Malformed \\uxxxx encoding.");
                            }
                         }
                        out[outLen++] = (char)value;
                    } else {
                        if (aChar == 't') aChar = '\t'; 
                        else if (aChar == 'r') aChar = '\r';
                        else if (aChar == 'n') aChar = '\n';
                        else if (aChar == 'f') aChar = '\f'; 
                        out[outLen++] = aChar;
                    }
                } else {
                out[outLen++] = (char)aChar;
                }
            }
            return new String (out, 0, outLen);
        }
        
}


二、adb命令


adb shell am start -n com.huasoft.send/com.huasoft.send.MainActivity --es mes "\u4f60\u597d" --es number "13323825958";


三、java代码 Runtime  rt=Runtime.getRuntime(); String temp="adb shell am start -n com.huasoft.send/com.huasoft.send.MainActivity --es mes \"\u4f60\u597d\" --es number \"13323825958\""; rt.exec(new String(temp.getBytes(),"GBK"));//windows下要有此转换,不然会乱码 简单说明一下,–ei表示参数类型为整型(extra integer),–es表示参数的类型为字符串(extra string)