2015-09-10 23 views
5

Merhaba Uygulamamın içinden uygulamayı Uygulama yoluyla yüklemeyi denedim. Bu işlev için bu yöntemi oluşturdum.Android. başarısız oldu: İşlemi kullanırken EPIPE (Kırık boru) Proses

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

Ama

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

Hata mesajı çağırdığında başarısız:

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) 

yerine

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

ait Denedim:

Bu yardımcı olmadı. Ayrıca, bu kod benim kök tabletim için çalışır ancak TV kutum için çalışmıyor.

Ben yöntemlerle kökünden cihazı kontrol edin:

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; 
} 

Bu doğru döndürür.

cevap

-5

Bir çözüm buldum. Sorun şu ki cihazımın "su" komutu yerine başka bir komutu var

+0

Gerçekten mi? Bu senin soruların cevabın mı? Daha spesifik olabilir misin? –

+0

@ user951793 Evet, deneyin. Üreticiye bağlandım (tam olarak aygıt için bir uygulama yaptım, böylece onlarla iletişim kurabileydim) ve "su" yerine başka bir komut çıktığında (üzgünüm, bu komutu burada yazamıyorum çünkü) Bu verilerin açıklanması – Dima

+0

üreticiden bahseder misiniz lütfen – iSandeep

İlgili konular