我试图执行以下方法来欺骗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());
}
也是非法的州例外。 我该怎么做才能让这个错误停止发生并让方法被多次调用?
答案 0 :(得分:2)
当您执行命令os.writeBytes("exit\n");
时,这将结束您的su会话。 su进程结束,你用来写su命令的管道被破坏了。
因此,如果要执行另一个命令,则必须重新启动新的su会话,或者不要关闭调用exit
的旧会话。
无论如何,我不会在你的onCreate()方法中启动su进程。超级用户权限应仅在需要时获取,而不是在应用程序启动时获取。
答案 1 :(得分:0)
我怀疑你可以在任何设备上更改MAC地址。
来自维基百科:
MAC地址通常由网络制造商分配 接口控制器(NIC)并存储在其硬件中,例如 卡的只读存储器或其他一些固件机制
答案 2 :(得分:0)
为什么你一次又一次地执行相同的代码你可以通过运行代码来保存mac地址,就像我们创建一个会话一样,如果你改变了设备,那么你必须再次检查mac地址。