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

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

2014-01-21 10:21 696 查看
最近想用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编码,但默认的短信发送器不能把编码转换为中文。所以就想到自己写一个短信发送器,先把编码转为中文在发送出去。

因此代码如下:

1、短信发送器:

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);

        }

        

}

2、adb命令

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

3、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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐