多次执行 Android 方法时出现 Broken pipe 错误?

Broken pipe error when executing Android method more than once?

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

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

    }

现在,当用户再次单击该按钮时,应用程序崩溃并且出现 "broken pipe" 错误。

 android.system.ErrnoException: write failed: EPIPE (Broken pipe)

还有一个非法状态异常。 我该怎么做才能让这个错误停止发生并让该方法被多次调用?

我怀疑您能否在任何设备上更改 MAC 地址。

来自维基百科:

MAC addresses are most often assigned by the manufacturer of a network interface controller (NIC) and are stored in its hardware, such as the card's read-only memory or some other firmware mechanism

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

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

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

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