5
こんにちは私はプロセスを介して私のアプリの内部にアプリをインストールしようとしました。その機能のために、私はこのメソッドを作成しました。Android。書き込みに失敗しました:使用時にEPIPE(壊れたパイプ)プロセス
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);
}
}
}
しかし、それは
outs.writeBytes(cmd + "\n");
エラーメッセージ呼び出したときに、それは失敗します。
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)
代わり
Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});
の私が試した:
Runtime.getRuntime().exec("su");
助けになりませんでした。
また、このコードはルートタブレットで動作しますが、テレビボックスでは機能しません。
私は方法を介して、ルート上のデバイスを確認します
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;
}
それはtrueを返します。
本当に?それはあなたの質問に対するあなたの答えですか?あなたはもっと具体的になりますか? –
@ user951793はい、それは試しです。私はメーカーと接続しています(私はちょうどデバイスのためにアプリを作ったので、私はそれらに連絡することができました)と判明したように、 "su"の代わりに別のコマンドがありました(申し訳ありません。このデータの漏れ) – Dima
おまけにメーカーからお願いします – iSandeep