Search code examples
androidcordovaauto-update

Phonegap Android app trigger update programmatically


I am building an Android app that is hosted on a server outside Google Play. I need the app to check for new version and prompt user to update when the app starts.

I built a mechanism to check for new version (the app checks for a file on server and compares version) which is working well. Then I prompt user to update, but if user chooses to proceed with the update, I'm not able to trigger the download and installation of the apk.

I tried simply opening the apk url:

window.open(apkURL);

where the apkURL is the full http link to the .apk file hosted on server.

But it doesn't seem to do anything.

I've been researching but I don't find an answer on how to do this. I found some suggestions using native code, like this post Install Application programmatically on Android but I don't know how to do that from within my Phonegap app.

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

Is this the right way to trigger the update? How can something like this be done from within a Phonegap app?

Thanks!


Solution

  • I finally managed to implement this, using the File api and the WebIntent plugin. I will post the solution here in case it helps anyone.

    The code downloads the apk from a remote server to the download folder in the sdcard and then triggers the install.

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