Как установить приложение для Android программно без подсказки, - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь установить приложение программно без запроса.Означает, установка приложения без отображения всплывающего окна, где пользователь должен нажать установить вариант.Я последовал ЭТОГО ответа.Но всякий раз, когда я запускаю код, он выдает ошибку

java.io.IOException: Ошибка при запуске exec ().Команда: [su, -c, adb install -r /storage/emulated/0/update.apk] Рабочая директория: null Среда: null

Причина: java.io.IOException: Отказано в разрешении на java.lang.ProcessManager.exec (собственный метод) на java.lang.ProcessManager.exec (ProcessManager.java:209)

В нем говорится, что разрешение отклонено, но не указано, какое разрешение.АПК находится в хранилище устройства, и я предоставил следующие разрешения в манифесте.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Ниже приведен код, который я использую для установки АПК

 public void InstallAPK(String filename){
    File file = new File(filename);
    if(file.exists()){
        try {
            String command;
            command = "adb install -r " + filename;
            Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
            proc.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

И явызвать эту функцию как:

InstallAPK(Environment.getExternalStorageDirectory().getAbsolutePath()+"/update.apk");

Может кто-нибудь, пожалуйста, помогите мне с разрешением, которое я пропускаю.

1 Ответ

0 голосов
/ 27 мая 2018

Проблема с тем, что вы делаете, заключается в том, что для получения разрешения INSTALL_PACKAGES ваше приложение должно находиться в папке / system / priv-app.Если ваше приложение не находится в этой папке, то вам не будет предоставлено разрешение, и ваше приложение не сможет работать.

Другой способ программной установки приложения без подсказок при условии, что у вас есть root-доступ, будет выглядеть следующим образом:

Сначала вы должны добавить это разрешение в свой манифест Android.<uses-permission android:name="android.permission.INSTALL_PACKAGES" /> Студия Android может жаловаться, что это системное разрешение и оно не будет предоставлено.Не беспокойтесь, поскольку ваше приложение будет установлено в папку / system / priv-app, оно получит только разрешение для этой системы.

После добавления разрешения вы можете использовать следующий статический метод для установки пакетов.,Все, что вам нужно сделать, это предоставить URL-адрес в виде String, который можно использовать для доступа к файлу, и Context, и приложение будет установлено.

 public static boolean installPackage(final Context context, final String url)
        throws IOException {
    //Use an async task to run the install package method
    AsyncTask<Void,Void,Void> task = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... voids) {
            try {
                PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
                PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
                        PackageInstaller.SessionParams.MODE_FULL_INSTALL);

                // set params
                int sessionId = packageInstaller.createSession(params);
                PackageInstaller.Session session = packageInstaller.openSession(sessionId);
                OutputStream out = session.openWrite("COSU", 0, -1);
                //get the input stream from the url
                HttpsURLConnection apkConn = (HttpsURLConnection) new URL(url).openConnection();
                InputStream in = apkConn.getInputStream();
                byte[] buffer = new byte[65536];
                int c;
                while ((c = in.read(buffer)) != -1) {
                    out.write(buffer, 0, c);
                }
                session.fsync(out);
                in.close();
                out.close();
                //you can replace this intent with whatever intent you want to be run when the applicaiton is finished installing
                //I assume you have an activity called InstallComplete
                Intent intent = new Intent(context, InstallComplete.class);
                intent.putExtra("info", "somedata");  // for extra data if needed..
                Random generator = new Random();
                PendingIntent i = PendingIntent.getActivity(context, generator.nextInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
                session.commit(i.getIntentSender());
            } catch (Exception ex){
                Log.e("AppStore","Error when installing application. Error is " + ex.getMessage());
            }

            return null;
        }
    };
   task.execute(null,null);
    return true;
}

Примечание. В случае сбоя установкидаже если приложение установщика находится в system / priv-app, убедитесь, что вы подписали приложение ключом разблокировки.Иногда подписывание с помощью ключа отладки препятствует предоставлению разрешения Install_Packages

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...