Error al ejecutar el comando adb mediante programación

Estoy tratando de ejecutar comandos adb mediante programación

Aquí está mi código:

File f = new File(Environment.getExternalStorageDirectory(), "screen" + System.currentTimeMillis() + ".png"); new ExecuteCommand(MainActivity.this).execute("adb shell screencap -p " + Environment.getExternalStorageDirectory().getPath() + "/" + "screen" + System.currentTimeMillis() + ".png"); 

ExecuteCommand Clase:

 public class ExecuteCommand extends AsyncTask<String, String, String> { Context mContext=null; public ExecuteCommand(Context _ctx) { mContext =_ctx; } ProgressDialog progressdailog; @Override protected void onPreExecute() { super.onPreExecute(); progressdailog = ProgressDialog.show(mContext, "Executing", "Please Wait"); } @Override protected String doInBackground(String... params) { Process p; StringBuffer output = new StringBuffer(); try { p = Runtime.getRuntime().exec(params[0]); BufferedReader reader = new BufferedReader( new InputStreamReader(p.getInputStream())); String line = ""; while ((line = reader.readLine()) != null) { output.append(line + "\n"); p.waitFor(); } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } String response = output.toString(); return response; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); progressdailog.dismiss(); Log.e("Output", result); } } 

Problema en registros:

07-31 15: 26: 31.832 18716-18716 / com.example E / Output: no se puede enlazar 'tcp: 5038' * daemon no se está ejecutando. Comenzando ahora en el puerto 5038 *

No puedo tomar una captura de pantalla, pero si ejecuté el mismo comando en el símbolo del sistema, entonces esto está funcionando bien.

Pero si ejecuto

 new ExecuteCommand(MainActivity.this).execute("ls"); 

Esto funciona bien. Por favor, ayúdame a encontrar que donde está el problema en el mando.

adb shell se utiliza cuando se está ejecutando el comando en su PC tratando de acceder al dispositivo. Pero cuando se está ejecutando el comando en el dispositivo en sí, no es necesario adb shell

Esto será limpio:

 new ExecuteCommand(MainActivity.this).execute("screencap -p " + f); 

Ha habido varias discusiones similares sobre esto, tanto en este sitio web como en android-developers , pero el TL: DR es que realmente no puedes ejecutar todos los comandos de shell desde el dispositivo. La mayoría de ellos necesitan permisos que sólo se conceden a las aplicaciones del sistema. El uso de los comandos shell pm por ejemplo necesita los diversos permisos de paquete, la mayoría de los cuales son sólo de sistema. Puedes consultar la lista de permisos aquí .

Tendrá que root el dispositivo, o buscar un método alternativo de lograr lo que desea.

Supongo que hay algún problema con los permisos.

Utilice el nuevo apis de MediaProjection para hacerlo.

Consulte https://github.com/googlesamples/android-ScreenCapture para obtener el código fuente.

  • Cómo empujar las carpetas de la computadora en sdcard usando adb shell
  • Cómo obtener la versión SDK de Android de un dispositivo desde la línea de comandos
  • ¿Existe un equivalente a 'adb shell texto de teclado de entrada' para iOS?
  • ¿Por qué el comando SQLite 3 que usa la shell ADB de Android devuelve "permiso denegado"?
  • FFMPEG para Android en Windows no se compila correctamente
  • Android: cómo ejecutar un comando de shell desde dentro del código
  • Compruebe si el directorio existe en Android sdcard con bash
  • ¿Por qué obtengo un error "sqlite3: not found" en un Nexus One enraizado cuando intento abrir una base de datos usando el shell de adb?
  • Cómo vaciar (borrar) el búfer logcat en Android
  • Emulate Force Stop de los comandos de ADB / Shell
  • Cómo salir de APK de shell
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.