Androide. Write failed: EPIPE (Broken pipe) cuando se usa Process

Hola, intenté instalar la aplicación dentro de mi aplicación a través de Process. Para esa función he creado este método.

private void loadAndInstallApk(String string) { if(!isRooted()){ return; } Uri uri = loadApk(string); if(uri == null){ return; } Process p = null; DataOutputStream outs = null; try { p = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"}); outs=new DataOutputStream(p.getOutputStream()); String cmd="pm install -r " + uri.getPath(); Log.d(TAG, "DATA = cmd = " + cmd); outs.writeBytes(cmd + "\n"); // Close the terminal outs.writeBytes("exit\n"); outs.flush(); p.waitFor(); if (p.exitValue() != 255) { Log.d(TAG, "DATA succerss " + p.exitValue()); // Sucess } else { Log.d(TAG, "DATA Fail " + p.exitValue()); // Fail } } catch (IOException e){ Log.e("Error", e.toString(), e); } catch (InterruptedException e) { Log.e("Error", e.toString(), e); } finally { if(outs != null) { try { outs.close(); } catch (IOException e) { Log.d(TAG, e.toString(), e); } } try { File f = new File(uri.getPath()); f.delete(); }catch (NullPointerException e) { Log.e(TAG, "DATA = finally delete " + e.toString(), e); } } } 

Pero falla cuando llama

  outs.writeBytes(cmd + "\n"); 

Mensaje de error:

 E/Error﹕ java.io.IOException: write failed: EPIPE (Broken pipe) java.io.IOException: write failed: EPIPE (Broken pipe) at libcore.io.IoBridge.write(IoBridge.java:455) at java.io.FileOutputStream.write(FileOutputStream.java:187) at java.io.OutputStream.write(OutputStream.java:82) at java.io.DataOutputStream.writeBytes(DataOutputStream.java:156) ... Caused by: libcore.io.ErrnoException: write failed: EPIPE (Broken pipe) at libcore.io.Posix.writeBytes(Native Method) at libcore.io.Posix.write(Posix.java:202) at libcore.io.BlockGuardOs.write(BlockGuardOs.java:197) at libcore.io.IoBridge.write(IoBridge.java:450) at java.io.FileOutputStream.write(FileOutputStream.java:187) at java.io.OutputStream.write(OutputStream.java:82) at java.io.DataOutputStream.writeBytes(DataOutputStream.java:156) 

En lugar de

 Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"}); 

Lo intenté:

 Runtime.getRuntime().exec("su"); 

No ayudó.

También este trabajo del código para mi tableta de la raíz pero no trabaja para mi caja de la TV.

Comprobo el dispositivo en la raíz vía métodos:

 private static boolean isRooted() { return findBinary("su"); } public static boolean findBinary(String binaryName) { boolean found = false; if (!found) { String[] places = {"/sbin/", "/system/bin/", "/system/xbin/", "/data/local/xbin/", "/data/local/bin/", "/system/sd/xbin/", "/system/bin/failsafe/", "/data/local/"}; for (String where : places) { Log.d(TAG, "DATA where = " + where); if ( new File( where + binaryName ).exists() ) { found = true; break; } } } return found; } 

Vuelve verdadero.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.