Descargar e instalar una aplicación (apk) desde la memoria interna – sin tarjeta SD

Saludos y un feliz año nuevo a todos mis compañeros programadores.

Mi código descarga un archivo apk desde un servidor remoto. Necesito iniciar el procedimiento de instalación a través del código, sin que el usuario tenga que instalarlo explícitamente. El problema es que no puedo usar una tarjeta SD para descargar el archivo apk.

Puedo navegar a la carpeta de datos / datos / archivos y puedo ver mi archivo descargado. El único problema es que no puedo conseguirlo instalado. Esto es lo que obtengo

'/data/data/org.obs.testinstall.main/files/app.apk': Permission denied 

Entiendo que Android no da permiso para acceder al directorio de datos. Mi pregunta es cómo puedo descargar e instalar una aplicación (apk) sin usar una tarjeta SD. Esta aplicación no pretende ser publicada en el mercado. He intentado usar tanto el almacenamiento interno usando

 FileOutputStream fos = openFileOutput("app.apk", Context.MODE_PRIVATE); 

y el directorio caché

 File file = getCacheDir(); File outputFile = new File(file, "app.apk"); 

Ambos dan el mismo resultado .. "Permiso denegado"

Cuando cambio el código para incorporar una tarjeta del SD la aplicación funciona perfectamente, pero usar una tarjeta del SD no es una opción.

Seguramente debe haber una manera de hacer esto. Es difícil creer que tal handicap exista en el O / S de Android.

¿Alguien ha hecho esto? ¿Alguna solución? Cualquier puntero sería útil.

Que causado por la aplicación de Android no puede leer de otro archivo de aplicación si se escribe con el modo PRIVATE.

Puedes hacerlo:

 String fileName = "tmp.apk"; FileOutputStream fos = openFileOutput(fileName, MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE); // write the .apk content here ... flush() and close() // Now start the standard instalation window File fileLocation = new File(context.getFilesDir(), fileName); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(fileLocation), "application/vnd.android.package-archive"); context.startActivity(intent); 

Tenga cuidado, ya que ese archivo es ahora visible en todo el mundo, y puede ser visto por cualquier aplicación en el mismo dispositivo, si conocen la ubicación del archivo.

No es necesario root. Sólo puede utilizar linux comando chmod para hacerlo.

 public static String exec(String[] args) { String result = ""; ProcessBuilder processBuilder = new ProcessBuilder(args); Process process = null; InputStream errIs = null; InputStream inIs = null; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); int read = -1; process = processBuilder.start(); errIs = process.getErrorStream(); while ((read = errIs.read()) != -1) { baos.write(read); } baos.write('\n'); inIs = process.getInputStream(); while ((read = inIs.read()) != -1) { baos.write(read); } byte[] data = baos.toByteArray(); result = new String(data); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (errIs != null) { errIs.close(); } if (inIs != null) { inIs.close(); } } catch (IOException e) { e.printStackTrace(); } if (process != null) { process.destroy(); } } return result; } 

en su programa, se puede invocar así:

  String[] args1 = { "chmod", "705", "/data/data/org.obs.testinstall.main/files/" }; exec(args1); String[] args2 = { "chmod", "604", "/data/data/org.obs.testinstall.main/files/app.apk" }; exec(args2); 

A continuación, puede instalar app.apk como desee.

Intente enraizar su dispositivo y luego ejecutar el programa desde el dispositivo, en lugar de utilizar un emulador.

Para mí startActivity el archivo apk justo después de la startActivity , que es asíncrono.

Lástima que no hay mejor descripción del error de análisis (archivo no encontrado, acceso denegado, archivo dañado en el paquete, …)

cuando envíe la intención de instalar apk, puede utilizar esta función para cambiar el modo de apk directorio.

 private static boolean changeMode(String filePath, String prefixPath) { if (TextUtils.isEmpty(prefixPath) || !filePath.startsWith(prefixPath)) { return true; } try { String[] args1 = { "chmod", "705", prefixPath}; Runtime.getRuntime().exec(args1); } catch (IOException e) { e.printStackTrace(); return false; } String subPath = filePath.split(prefixPath)[1]; String[] subArr = subPath.split(File.separator); for (String path : subArr) { if (!TextUtils.isEmpty(path)) { prefixPath = prefixPath + File.separator + path; try { if (!prefixPath.endsWith(".apk")) { String[] progArray1 = {"chmod", "705", prefixPath}; Runtime.getRuntime().exec(progArray1); } else { String[] progArray2 = {"chmod", "604", prefixPath}; Runtime.getRuntime().exec(progArray2); } } catch (IOException e) { e.printStackTrace(); return false; } } } return true; } 

Y antes de enviar la intención, compruebe chmod es alreay éxito.

  boolean chmodRes = changeMode(filePath, context.getCacheDir().getAbsolutePath()) && changeMode(filePath, context.getFilesDir().getAbsolutePath()); if (!chmodRes) { return false; } 
  • ¿Cómo usar el instalador de paquetes predeterminado (Android) al intentar instalar un APK desde otra aplicación?
  • Cómo escribir una aplicación de Android para hacer sysfs leer / escribir.
  • Archivos de expansión en la nueva consola de desarrolladores de Google Play
  • archivo APK no válido
  • Cómo determinar qué mercado de android se utilizó para descargar mi aplicación
  • Android XML extraído de APK - Codificación incorrecta
  • Servicio de actualización de la versión de la aplicación Android sin liberarlo al mercado
  • Android - ¿Cómo hacer un archivo .apk sin depuración?
  • Error al instalar apk - analizar el paquete
  • Generación de apk firmado. Error: (7) en build / generated / res / generated / release / values ​​/ generated.xml
  • Instalación silenciosa en dispositivos Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.