Olá, estou trabalhando em um projeto Phonegap no Android onde, entre outros, tenho uma página com um botão que irá disparar um processo de download para sdcard / download / e depois um processo de instalação.
Nessa dica vou escrever minha solução que funciona no momento. Provavelmente existem soluções melhores, mas ainda estou aprendendo todas essas tecnologias e estou feliz que pelo menos funcione.
Portanto, a primeira etapa seria criar uma classe Java em seu projeto que estenda a classe CordovaPlugin. Eu o chamei de “InstallIntent.java”. É uma aula muito simples, onde tudo o que importa é o método “execute”:
import java.io.File;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;
import org.json.JSONArray;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
public class InstallIntent extends CordovaPlugin {
@Override
public boolean execute(String action, final JSONArray args, final CallbackContext callbackContext) {
if (action.equals("install")) {
cordova.getThreadPool().execute(new Runnable() {//
@Override
public void run() {
String apkPath = Environment.getExternalStorageDirectory().toString() + "/download/YourAPK.apk";
Intent install = new Intent(Intent.ACTION_VIEW);
install.setDataAndType(Uri.fromFile(new File(apkPath)),"application/vnd.android.package-archive");
cordova.getActivity().startActivity(install);
Log.d("my tag", "after the install action");
//showToast("App cache is deleted.","short");
}
});
callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK));
return true;
} else {
Log.e("PhoneGapLog", "CacheCleaner Plugin: Error: " + PluginResult.Status.INVALID_ACTION);
callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.INVALID_ACTION));
return false;
}
}
}
A ação neste caso é chamada de “instalar” e é importante, pois será chamada a partir do Javascript.
No seu projeto Phonegap, na pasta assets / www / js específica, crie install-intent.js
cordova.define("cordova/plugin/installation", function (require, exports, module) {
var exec = require("cordova/exec");
module.exports = {
install: function (win, fail) {
exec(win, fail, "InstallIntent", "install", []); //InstallIntent is the name of the Java class and install is the method called from the front end side.
}
};
});
No arquivo de manifesto, incluí as seguintes permissões:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RESTART_PACKAGES"/>
Em seu index.html, inclua cordova.js, arquivos install-intent.js e o arquivo com seus scripts personalizados, por exemplo custom.js onde você pode chamar seu install_intent assim:
var installation = cordova.require("cordova/plugin/installation");
installation.install(function() {
console.log("PhoneGap Plugin: InstallIntent: callback success");
},
function() {
console.log("PhoneGap Plugin: InstallIntent: callback error");
}
);
No final, adicione a seguinte linha ao seu config.xml (aquele em ProjectName plataformas android res xml)
<feature name="InstallIntent">
<param name="android-package" value="com.your.package.name.InstallIntent" />
</feature>
Novamente, este plugin irá disparar um processo de instalação do arquivo .apk do diretório externo / download. Espero que ajude alguém.