14

Google Play 以外のサーバーでホストされている Android アプリを構築しています。アプリが新しいバージョンを確認し、アプリの起動時にユーザーに更新を促す必要があります。

新しいバージョンをチェックするメカニズム (アプリがサーバー上のファイルをチェックしてバージョンを比較する) を構築しましたが、これはうまく機能しています。次に、ユーザーに更新を求めますが、ユーザーが更新を続行することを選択した場合、apk のダウンロードとインストールをトリガーできません。

私は単純にapkのURLを開こうとしました:

window.open(apkURL);

apkURL は、サーバーでホストされている .apk ファイルへの完全な http リンクです。

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

私は調査を行ってきましたが、これを行う方法についての答えが見つかりません。この記事のように、ネイティブ コードを使用していくつかの提案を見つけまし

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

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

ありがとう!

4

5 に答える 5

16

File API とWebIntentプラグインを使用して、最終的にこれを実装することができました。誰にも役立つ場合に備えて、ここに解決策を投稿します。

このコードは、リモート サーバーから sdcard のダウンロード フォルダーに apk をダウンロードし、インストールをトリガーします。

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);
});
于 2013-04-10T17:18:34.743 に答える
12

Cordova 3+ を使用している皆さんには、Vero のような同様のソリューションが可能です。

まず、.apk ファイルをダウンロードします。これにはファイル転送プラグインが必要です。次のコマンドでインストールできます。

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

次に、Webintent を開始するための別のプラグインが必要です。この Webintent は、更新がある場合にユーザーにプロンプ​​トを表示します。次のコマンドでインストールできます。

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);
        }
    );
}
于 2014-05-09T09:55:37.727 に答える
0

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

于 2013-04-08T13:59:27.110 に答える
0

答えてくれたベロに感謝します...それは私をとても助けてくれます...コルドバファイルプラグインの最後のバージョンのコードに問題があります。 ファイル プラグイン バージョン 1.0.0 以降を使用する場合は、entry.fullPath を entry.toURL() に置き換えます。entry.fullPath を使用すると、「パッケージの解析に問題があります」というエラーがスローされます。

github のファイル転送プラグインから

これらのパスは、File プラグインによって返される FileEntry および DirectoryEntry オブジェクトの fullPath プロパティで以前に公開されていました。ただし、File プラグインの新しいバージョンでは、これらのパスを JavaScript に公開しなくなりました。

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

FileEntry.toURL() および DirectoryEntry.toURL() は、次の形式のファイルシステム URL を返します。

cdvfile://localhost/persistent/path/to/file は、download() メソッドと upload() メソッドの両方で絶対ファイル パスの代わりに使用できます。

于 2015-04-02T18:12:28.073 に答える