2013-04-08 7 views
14

Google Play以外のサーバーでホストされているAndroidアプリを構築しています。私は、新しいバージョンを確認するためにアプリを必要とし、アプリの起動時にユーザーに更新を促します。Phonegap Androidアプリのトリガによる更新プログラム

新しいバージョン(サーバー上のファイルをチェックしてバージョンを比較する)をチェックする仕組みを構築しています。これはうまくいきます。その後、ユーザーに更新を促しますが、ユーザーが更新を続行することを選択した場合、apkのダウンロードとインストールを開始できません。 apkURLは、サーバ上でホストされた.apkファイルへの完全なHTTPリンクをある

window.open(apkURL); 

私は単純にAPKのURLを開いてみました。

しかし、何もしないようです。

私は研究していますが、これを行う方法に関する回答は見つかりません。私はこの投稿のようなネイティブコードを使用していくつかの提案を見つけましたInstall Application programmatically on Androidしかし、私はどのように私のPhonegapアプリ内から行うか分からない。

これは正しい方法で更新をトリガーしますか?このようなことをPhonegapアプリ内からどうすればできますか?

ありがとうございます!

答えて

15

最後に、File apiとWebIntentプラグインを使用してこれを実装することができました。誰かを助ける場合に備えて、ここに解決策を掲載します。

コードは、リモートサーバーからapkをsdcardのダウンロードフォルダにダウンロードし、インストールを開始します。コルドバ3+、ベロのような同様のソリューションを使用君たちのために

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

インストール後apkでphonegapを使用するにはどうすればそのapkを自動起動できますか? fileapiまたはwebintentプラグインに具体的な方法がありますか教えてください – nida

+1

http://download.com/update/myapp.apkからアップデートをダウンロードしたいです。それではコードは何でしょうか?助けてください。あなたの答えは –

0

悲しいことに、プラグインを使用せずにPhonegap Webコンテナ内のその種のネイティブ機能にアクセスすることはできません。ユーザーをapkにリンクして(たとえばネイティブブラウザを開いて)インストールできます。

+0

お返事ありがとうございます。私は[webintent](https://github.com/phonegap/phonegap-plugins/tree/master/Android/WebIntent)phonegapプラグインを確認して、動作可能かどうかを確認しています。あなたがapkへのリンクを言うとき、それは通常のリンクですか?なぜリンクは動作しますが、私のwindow.openは動作しませんか?ありがとう。 – Vero

+0

もちろん、プラグインを使用すると、Cordovaの制限を回避できます。このプラグインはわかりませんでしたが、うまくいくはずです。リンクすると、実際にnavigator.app.loadUrlのようなものでapkを開くネイティブブラウザを開くことを考えていました。 – zakinster

11

可能です:

だから我々は最初の.apkファイルをダウンロードしようとしています。これにはファイル転送プラグインが必要です。 あなたは、次のコマンドでインストールすることができます。

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

を第二に、我々はwebintentを開始するために別のプラグインを必要としています。このWebintentは、更新があるかどうかをユーザーに確認します。あなたは、次のコマンドでインストールすることができます。

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

次に、あなたがた.apkをダウンロードするには、アプリケーションの更新がある 場合、ユーザーに促すために、あなたのコード内でこの2つの機能を使用することができます。

/* 
* 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); 
     } 
    ); 
} 
+2

ありがとう。 downloadApkAndroid関数の 'data'パラメータは何ですか?それを呼び出す例を共有することはできますか? – carlospiles

+0

文字列の配列だけで、 'data.android'にはダウンロードするAPKのURLが含まれています。 – janpio

+0

どうすればその関数を呼び出すことができますか? –

0

ベロさんのお返事ありがとうございました...それほど助けてくれます... コードヴァーバーファイルプラグイン最終バージョンでコードに問題があります。 ファイルプラグインバージョン1.0.0以降を使用している場合は、entry.toURL()で、entry.fullPathを置き換えてください。 entry.fullPathを使用すると、 'パッケージを解析中に問題があります。'というエラーが発生します。

from file-transfer plugin on github

これらのパスは、以前のファイルプラグインによって返されたファイルエントリとのDirectoryEntryオブジェクトのプロパティをフルパスで暴露しました。ただし、Fileプラグインの新しいバージョンでは、これらのパスがJavaScriptに公開されることはなくなりました。

Fileの新しいバージョン(1.0.0以降)にアップグレードしていて、かつ以前にentry.fullPathを引数としてdownload()またはupload()に使用していた場合は、コードを変更する必要があります代わりにファイルシステムのURLを使用します。

FileEntry.toURL()とDirectoryEntry.toURL()形式のファイルシステムのURLを返す

cdvfile:// localhost /を永続/パス/絶対ファイルの代わりに使用することができます/ファイル へpathをdownload()メソッドとupload()メソッドの両方で使用します。

関連する問題