Подтвердить что ты не робот

Ошибка при выполнении команды adb программно

Я пытаюсь выполнить команды adb программно

Вот мой код:

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:

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

Проблема в журналах:

07-31 15: 26: 31.832 18716-18716/com.example E/Output: невозможно связать 'tcp: 5038' * daemon не работает. начиная с порта 5038 *

Я не могу сделать снимок экрана, но если я запустил ту же команду в командной строке, это работает нормально.

Но если я выполняю

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

это отлично работает. Где проблема в команде?

4b9b3361

Ответ 1

adb shell используется, когда вы выполняете команду на своем ПК, пытаясь получить доступ к устройству. Но когда вы выполняете команду на самом устройстве, вам не нужно adb shell

Это будет чистым:

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

Ответ 2

Было несколько подобных обсуждений по этому вопросу, как на этом веб-сайте, так и android-developers, но TL: DR - это то, что вы действительно не можете запустите все команды оболочки с устройства. Большинство из них нуждаются в разрешениях, предоставляемых только системным приложениям. Использование команд оболочки pm, например, требует различных разрешений пакетов, большинство из которых являются системными. Вы можете проверить список разрешений здесь.

Вам придется либо запустить root, либо искать альтернативный метод достижения того, что вы хотите.