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

Обновление программного обеспечения Android-приложения Phonegap программно

Я создаю приложение для Android, размещенное на сервере вне Google Play. Мне нужно приложение для проверки новой версии и запроса пользователя на обновление при запуске приложения.

Я построил механизм проверки новой версии (приложение проверяет файл на сервере и сравнивает версию), который работает хорошо. Затем я предлагаю пользователю обновить, но если пользователь решит продолжить обновление, я не могу запустить загрузку и установку apk.

Я попробовал просто открыть apk url:

window.open(apkURL);

где apkURL - это полная HTTP-ссылка на файл .apk, размещенный на сервере.

Но он ничего не делает.

Я занимаюсь исследованиями, но я не нахожу ответа о том, как это сделать. Я нашел некоторые предложения, используя собственный код, например, этот пост Установить приложение программно на Android, но я не знаю, как это сделать из моего приложения Phonegap.

Intent promptInstall = new Intent(Intent.ACTION_VIEW)
.setData(Uri.parse("file:///path/to/your.apk"))
.setType("application/vnd.android.package-archive");
startActivity(promptInstall); 

Правильно ли это инициировать обновление? Как это можно сделать из приложения Phonegap?

Спасибо!

4b9b3361

Ответ 1

Мне, наконец, удалось реализовать это, используя File api и WebIntent. Я отправлю решение здесь, если оно поможет кому-либо.

Код загружает apk с удаленного сервера в папку загрузки на SD-карте, а затем запускает установку.

window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem){
fileSystem.root.getFile('download/filename.apk', {
    create: true, 
    exclusive: false
  }, function(fileEntry) {
    var localPath = fileEntry.fullPath,
    fileTransfer = new FileTransfer();        
    fileTransfer.download(apkURL, localPath, function(entry) {
        window.plugins.webintent.startActivity({
            action: window.plugins.webintent.ACTION_VIEW,
            url: 'file://' + entry.fullPath,
            type: 'application/vnd.android.package-archive'
            },
            function(){},
            function(e){
                alert('Error launching app update');
            }
        );                              

    }, function (error) {
        alert("Error downloading APK: " + error.code);
  });
  }, function(evt){
      alert("Error downloading apk: " + evt.target.error.code);                                               
  });
}, function(evt){
alert("Error preparing to download apk: " + evt.target.error.code);
});

Ответ 2

Для вас, ребята, которые используют Cordova 3+, возможно подобное решение Vero:

Итак, мы сначала загрузим файл .apk. Для этого нам нужен плагин для переноса файлов. Вы можете установить его с помощью следующей команды:

phonegap local plugin add org.apache.cordova.file-transfer

Во-вторых, нам нужен еще один плагин для запуска веб-сайта. Этот веб-узел запрашивает у пользователя, есть ли обновление. Вы можете установить его с помощью следующей команды:

phonegap local plugin add https://github.com/Initsogar/cordova-webintent.git

Затем вы можете использовать эти 2 функции в вашем коде для загрузки .apk и запроса пользователю, если есть обновление приложения:

/*
 * Uses the filetransfer plugin
 */
function downloadApkAndroid(data) {
    var fileURL = "cdvfile://localhost/persistent/CegekaMon.apk";

    var fileTransfer = new FileTransfer();
    var uri = encodeURI(data.android);

    fileTransfer.download(
        uri,
        fileURL,
        function (entry) {

            console.log("download complete: " + entry.fullPath);

            promptForUpdateAndroid(entry);
        },
        function (error) {
            console.log("download error source " + error.source);
            console.log("download error target " + error.target);
            console.log("upload error code" + error.code);
        },
        false,
        {

        }
    );
}
/*
 * Uses the borismus webintent plugin
 */
function promptForUpdateAndroid(entry) {
    window.plugins.webintent.startActivity({
            action: window.plugins.webintent.ACTION_VIEW,
            url: entry.toURL(),
            type: 'application/vnd.android.package-archive'
        },
        function () {
        },
        function () {
            alert('Failed to open URL via Android Intent.');
            console.log("Failed to open URL via Android Intent. URL: " + entry.fullPath);
        }
    );
}

Ответ 3

К сожалению, вы не можете получить доступ к этой родной функции в веб-контейнере Phonegap без использования плагина, все, что вы можете сделать, - это связать пользователя с apk (например, открыв собственный браузер) и позволить ему установить его.

Ответ 4

спасибо Веро за ответ... это мне очень помогает... есть проблема с вашим кодом в кордовом файле плагина последней версии. заменить entry.fullPath на entry.toURL(), если вы используете файловый плагин версии 1.0.0 или новее. если вы используете entry.fullPath, он выдает ошибку "есть пакет анализа проблем".

из плагина переноса файлов в github

Эти пути ранее были открыты в свойстве fullPath объектов FileEntry и DirectoryEntry, возвращаемых плагином File. Однако новые версии плагина File больше не отображают эти пути для JavaScript.

Если вы обновляетесь до новой (1.0.0 или более новой) версии файла, и ранее вы использовали entry.fullPath в качестве аргументов для загрузки() или upload(), тогда вам нужно будет изменить свой код на вместо этого используйте URL-адреса файловой системы.

FileEntry.toURL() и DirectoryEntry.toURL() возвращают URL-адрес файловой системы формы

cdvfile://локальный/устойчивый/путь/к/файлу который может использоваться вместо абсолютного пути файла в методах download() и upload().