Проверить установку приложения

Я хочу написать простую программу (java), запускаемую на рабочем столе, чтобы сначала проверить, установлено ли какое-либо приложение на устройстве, а если нет, установить его. Для части установки я могу использовать команду adb install. Как проверить, установлено ли приложение на устройстве.

Для VTClers: хотя вопрос задан с точки зрения разработчиков (и вопросы разработки здесь не по теме), этот вопрос также представляет интерес для опытных пользователей. Сценарий: проверьте, установлено ли определенное приложение на устройстве, подключенном через ADB, без использования графических элементов.
Почему вам нужно проверять наличие приложения перед установкой? Команда -rswitch to adb installуже выполняет эту проверку и переустанавливает приложение (с сохранением всех данных), если оно уже существует.
Изначально мне не нужно переустанавливать то же приложение, если оно уже установлено. Я дам информационное сообщение, если установить ..

Ответы (2)

Вы можете найти свой ответ, например, на Github , а подробности — в документации разработчиков :

adb shell 'pm list packages [options] <FILTER>'

Печатает все пакеты, опционально только те, имя пакета которых содержит текст в формате .

Параметры:

-f: See their associated file.
-d: Filter to only show disabled packages.
-e: Filter to only show enabled packages.
-s: Filter to only show system packages.
-3: Filter to only show third party packages.
-i: See the installer for the packages.
-u: Also include uninstalled packages.
--user <USER_ID>: The user space to query.

Как видите: если вы не указали -uпараметр, pm listбудут отображаться только установленные приложения. Отфильтруйте вывод для пакета, с которым вы хотите иметь дело. Если вывод «пустой», пакет не установлен:

adb shell 'pm list packages' | grep -x 'com.foobar'

не должен ничего выводить, если com.foobarон не установлен.

Поскольку в своем вопросе вы ссылаетесь как на java, так и на adb, похоже, что вы знакомы с обоими.

Просто используйте ваше Java-приложение в качестве оболочки для выполнения системных команд adb.

Используя системные команды для adb, вы можете использовать ту же программу Java (оболочку adb) для проверки установки и фактического выполнения установки.

Вы можете заменить «пакеты pm list» любой из команд adb, выполняющих ваши намерения.

Это класс Java, который вы можете использовать. Конечно, ваше Java-приложение может искать в возвращаемой строке (ответе) приложения, которые вы хотите проверить.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;


public class checkandroid {

    static int exitstatus;

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        String shellcommand = "/opt/android/android-studio/sdk/platform-tools/adb shell pm list packages";

        String response = runit(shellcommand);

        System.out.println(response);

    }
    static String runit(String inputstr) {
        String output = "";
        exitstatus = 0;

        Process p = null;

        // -----------------------------------------------

        try {

            p = Runtime.getRuntime().exec(inputstr);

            InputStream cmdStdOut = null;
            InputStream cmdStdErr = null;

            cmdStdOut = p.getInputStream();
            cmdStdErr = p.getErrorStream();

            String line = "";
            String line1 = "";
            BufferedReader stdOut = new BufferedReader(new InputStreamReader(
                    cmdStdOut));
            BufferedReader stdErr = new BufferedReader(new InputStreamReader(
                    cmdStdErr));
            while ((line = stdOut.readLine()) != null) {
                // logger.info(line);
                // System.out.println(line);
                output += line + "\n";
            }
            stdOut.close();
            System.out.print("Error Status: ");
            while ((line1 = stdErr.readLine()) != null) {
                // logger.info(line);
                System.out.println(line1);
                output += line1;
            }
            stdErr.close();

            try {
                p.waitFor();

            } catch (InterruptedException e) {
                // Auto-generated catch block
                e.printStackTrace();
            }
            exitstatus = p.exitValue();
            System.out.println(p.exitValue());
        } catch (IOException e) {
            // Auto-generated catch block
            e.printStackTrace();
        }

        // -----------------------------------------------

        return output;
    }

}
Спасибо, Иззи и LD Джеймс, я объединил их и добился успеха :)
@ user3734225 Пожалуйста! Подумайте о том, чтобы внести свой вклад в сообщество, отметив проблему как решенную, нажав на галочку. Это пометит хороший ресурс для следующего человека, имеющего аналогичный вопрос. Рад помочь!