Выполнять команды через C-код в Android

1

Я хочу выполнить команду скриншота "adb shell /system/bin/screencap -p /sdcard/img.png" в C. Я искал то же самое, и я получил решение для другой команды, и я изменил команду как

execl("/system/bin/screencap", "-p", "storage/sdcard0/screenShot.png", (char *)NULL);

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

Как мне изменить команду "/system/bin/screencap -p /sdcard/img.png" для запуска из кода C.


Обновление после ответа на вопрос

Приложение снова закрывается, и здесь находится журнал

06-21 11:52:01.488: I/WindowState(279): WIN DEATH: Window{40fed2c0 u0 com.mytest.ndktestapplication/com.mytest.ndktestapplication.MainActivity}
06-21 11:52:01.498: I/ActivityManager(279): Process com.mytest.ndktestapplication (pid 7745) has died.
06-21 11:52:01.498: W/ActivityManager(279): Force removing ActivityRecord{40ea9ab8 u0 com.mytest.ndktestapplication/.MainActivity}: app died, no saved state
Теги:
android-ndk

2 ответа

3
Лучший ответ

Это ожидаемый результат семейных функций exec().

Что они делают, заменить текущую программу на указанную. Итак, до свидания.

Чтобы избежать этого, вам сначала нужно вызвать fork(), а затем вызвать exec() только в дочернем элементе, примерно так:

if (!fork()) {
    // fork() returned zero, so we are in the child
    execl...
}

Возможно, вам придется выполнить некоторую очистку перед вызовом функции exec.

Обратите внимание, что вы не сможете сделать снимок экрана из приложения на большинстве устройств, поскольку код приложения работает под идентификатором пользователя, которому не хватает разрешения на это. Но я, кажется, вспоминаю что существует узкий период, когда некоторые устройства отправляются без разрешения на эту функциональность, поэтому они могут работать на них.

  • 0
    Вы правы для разрешения вопроса. это главная проблема, с которой я сталкиваюсь, это то, что я не могу знать, если команда выполнена или нет :(. Есть ли какая-либо другая команда, которую я могу проверить, чтобы убедиться, что команды выполняются?
  • 0
    Без перенаправления оболочки будет сложно получить выходные данные, хотя вы можете открыть файл как stdout и затем выполнить «ls» или что-то в этом роде. Или вы можете использовать «am» с длинным списком аргументов для отправки намерения. Может случиться так, что вы можете получить 'sh', чтобы просто сидеть там и обнаруживать его в списке процессов. Я забываю, можете ли вы «установить пропроп» что-то совершенно нестандартное. Написание собственной программы, которая регистрирует hello world с помощью функции android native log, также было бы возможным. Вероятно, есть идеальная идея, о которой я не думаю.
Показать ещё 4 комментария
1

Вызов

execl(path, arg0, arg1, ..., (char*) NULL);

Второй аргумент arg0 - это имя, которое было сказано в программе, для его вызова. Фактические аргументы, заданные программе, начинаются только с arg1.

Итак, вы должны изменить свой код на

execl("/system/bin/screencap", "screencap", "-p", "<pic>", (char *)NULL);
  • 0
    Привет, Том, я использовал твой код, но результат тот же. Приложение закрывается. Можете ли вы дать представление о system() плз
  • 0
    system("/system/bin/screencap -p storage/sdcard0/jni_knox_test.png") , но я не думаю, что это даст вам другие результаты.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню