Как отправить команду на андроид, а затем получить ее ответ? - PullRequest
2 голосов
/ 16 февраля 2012

Я хочу написать echo -e "AT\r" > /dev/smd0 в оболочке и затем получить ответ. Ответ будет в \dev\smd0.

Я искал в Google и нашел это:

 Runtime r = Runtime.getRuntime();
            process = r.exec("su");
            process = r.exec("echo -e \"AT\\r\" > /dev/smd0");

но это не работает.

И я не знаю, как прочитать ответ.

Если я установлю эмулятор терминала, я могу написать команду и получить ответ с помощью cat \dev\smd0.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Попробуйте вот так :

try {  
    Runtime r = Runtime.getRuntime();
    Process process = r.exec(" su -c 'echo -e \"AT\\r\" > /dev/smd0; cat /dev/smd0' ");

    BufferedReader in = new BufferedReader(  
                        new InputStreamReader(process.getInputStream()));  
    String line = null;  
    while ((line = in.readLine()) != null) {  
        System.out.println(line);  
    }  
} catch (IOException e) {  
    e.printStackTrace();  
}  

Дополнительно вам нужен root-доступ к вашему телефону.

1 голос
/ 16 февраля 2012

обнаружил проблему с помощью этой ссылки :

Runtime r = Runtime.getRuntime();


            Process process = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(
                    process.getOutputStream());
            os.writeBytes("echo -e \"AT\\r\" > /dev/smd0\n");
            os.flush();
            os.writeBytes("exit\n");
            os.flush();

\n в конце команды и для некоторых команд, которые требуют su, нам нужно использовать DataOutPutStream отправить команду.

РЕДАКТИРОВАТЬ:

с кодом ниже, я могу прочитать его:

public class read implements Runnable {

    private Thread mBlinker;

    private ArrayList<String> output = new ArrayList<String>();

    public String getResponce() {
        if (output.size() != 0) {
            String ans = output.get(0);
            output.remove(0);
            return ans;
        }
        return null;
    }

    public void start() {
        mBlinker = new Thread(this);
        mBlinker.start();
    }

    public void stop() {
        mBlinker = null;
    }

    private DataInputStream dis;
    private DataOutputStream dos;

    @Override
    public void run() {
        System.out.println("START READ");
        try {
            Runtime r = Runtime.getRuntime();
            Process process = r.exec("su");
            dos = new DataOutputStream(process.getOutputStream());
            dos.writeBytes("cat /dev/smd0\n");
            dos.flush();

            dis = new DataInputStream(process.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (mBlinker != null) {
            try {
                int av = dis.available();
                if (av != 0) {
                    byte[] b = new byte[av];
                    dis.read(b);
                    output.add(new String(b));
                    System.out.println(new String(b) + "Recieved form modem");
                }
                else
                {
                    Thread.sleep(100);
                }
            } catch (IOException e) {
                if (e.getMessage() != null)
                    System.out.println(e.getMessage());
                e.printStackTrace();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        try {
            dos.writeBytes("exit\n");
            dos.flush();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("STOP READ");
    }
}
...