android - pendientes - actualizar play store 2018
Aplicación de actualización automática (3)
¡Resuelto! :RE
Simplemente funciona en dispositivos rooteados pero funciona perfectamente. El uso de unix cmd "pm" (packageManager) le permite instalar apks desde sdcard, cuando se ejecuta como root.
Espero que esto pueda ayudar a algunas personas en el futuro.
public static void installNewApk()
{
try
{
Runtime.getRuntime().exec(new String[] {"su", "-c", "pm install -r /mnt/internal/Download/fp.apk"});
}
catch (IOException e)
{
System.out.println(e.toString());
System.out.println("no root");
}
}
Permisos requeridos:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
TL: DR; versión ;)
Mi aplicación debería ejecutarse sin la interacción del usuario (el inicio automático, etc. funciona)
debe actualizarse (a través de apk) sin la interacción del usuario
los dispositivos arraigados son posibles
.
problema:
- consultar un apk más reciente de un servidor funciona
- al iniciar el apk con una intención (¿ver?), aparece el mensaje "instalar aplicación" y necesita una confirmación del usuario
¿Cómo resuelvo esto sin la interacción del usuario?
http://code.google.com/p/auto-update-apk-client/ Esto parece ser una solución, pero debe haber un mejor enfoque.
Ya encontré esto: Instalar la aplicación programáticamente en Android
Pero eso no resuelve mi problema.
Mi sugerencia es utilizar un mecanismo de complemento en lugar de actualizar la aplicación. Puede cargar clases de forma dinámica desde la Web y ejecutarlas dentro de su aplicación sin la interacción del usuario. Hay una gran cantidad de recursos distribuidos en Internet:
¿Cómo cargar una clase de Java dinámicamente en android / dalvik?
http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html
Si su -c
no funciona, intente su 0
(¡solo los dispositivos rooteados pueden hacer su!)
La respuesta completa se ve así:
private void installNewApk()
{
String path = mContext.getFilesDir().getAbsolutePath() + "/" + LOCAL_FILENAME;
mQuickLog.logD("Install at: " + path);
ProcessUtils.runProcessNoException(mQuickLog, "su", "0", "pm", "install", "-r", path);
}
Con esta clase definida:
public class ProcessUtils {
Process process;
int errCode;
public ProcessUtils(String ...command) throws IOException, InterruptedException{
ProcessBuilder pb = new ProcessBuilder(command);
this.process = pb.start();
this.errCode = this.process.waitFor();
}
public int getErrCode() {
return errCode;
}
public String getOutput() throws IOException {
InputStream inputStream = process.getInputStream();
InputStream errStream = process.getErrorStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String line;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line + System.getProperty("line.separator"));
}
br = new BufferedReader(new InputStreamReader(errStream));
while ((line = br.readLine()) != null) {
sb.append(line + System.getProperty("line.separator"));
}
return sb.toString();
}
public static String runProcess(String ...command) throws IOException, InterruptedException {
ProcessUtils p = new ProcessUtils(command);
if (p.getErrCode() != 0) {
// err
}
return p.getOutput();
}
public static void runProcessNoException(String ...command) {
try {
runProcess(command);
} catch (InterruptedException | IOException e) {
// err
}
}
}