多次执行Android方法时管道错误?

时间:2015-06-22 14:05:59

标签: java android illegalstateexception broken-pipe

我试图执行以下方法来欺骗Android设备的MAC地址。每次用户单击按钮时,该方法都会运行:

        MyProject/
              AndroidManifest.xml
              res/
                  ... (resources for main application)
              src/
                  ... (source code for main application) ...
              tests/
                  AndroidManifest.xml
                  res/
                      ... (resources for tests)
                  src/
                      ... (source code for tests)

现在,当用户再次点击该按钮时,应用程序崩溃,我得到了#34;破坏了管道"错误。

public void changeMac(View v) throws IOException {
        editText = (EditText)findViewById(R.id.newMacText);
        String mac = editText.getText().toString();
        Log.d("my log", "" + mac);
        String[] cmds = {"ip link set wlan0 address " + mac};

        Log.d("my log", "in method");
        DataOutputStream os = new DataOutputStream(p.getOutputStream());
        for (String tmpCmd : cmds) {
            os.writeBytes(tmpCmd + "\n");
        }
        os.writeBytes("exit\n");
        os.flush();


        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(p.getInputStream()));

        StringBuilder result = new StringBuilder();
        String line = "";
        while ((line = bufferedReader.readLine()) != null) {
            result.append(line);
        }

       Log.d("my log", "new mac " + Utils.getMACAddress("wlan0"));
        Log.d("my log", result.toString());

    }

也是非法的州例外。 我该怎么做才能让这个错误停止发生并让方法被多次调用?

3 个答案:

答案 0 :(得分:2)

当您执行命令os.writeBytes("exit\n");时,这将结束您的su会话。 su进程结束,你用来写su命令的管道被破坏了。

因此,如果要执行另一个命令,则必须重新启动新的su会话,或者不要关闭调用exit的旧会话。

无论如何,我不会在你的onCreate()方法中启动su进程。超级用户权限应仅在需要时获取,而不是在应用程序启动时获取。

答案 1 :(得分:0)

我怀疑你可以在任何设备上更改MAC地址。

来自维基百科:

  

MAC地址通常由网络制造商分配   接口控制器(NIC)并存储在其硬件中,例如   卡的只读存储器或其他一些固件机制

答案 2 :(得分:0)

为什么你一次又一次地执行相同的代码你可以通过运行代码来保存mac地址,就像我们创建一个会话一样,如果你改变了设备,那么你必须再次检查mac地址。