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.

5 Solutions collect form web for “Descargar e instalar una aplicación (apk) desde la memoria interna – sin tarjeta SD”

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 obtener la firma firmada de APK?
  • Inyección de código en APK
  • Sobrecarga un APK y crea aplicaciones personalizadas
  • ¿Podemos subir apk con diferentes keystore firmado después de desactivar el apk actual en android
  • Fallo al intentar instalar APK en el emulador
  • La exportación de Android se anuló porque se encontraron errores fatales
  • No se puede generar APK firmado en Android Studio, porque proguard-rules.txt está ausente
  • Si no comprimo un archivo de texto sin formato en Android, ¿se comprimirá en el APK de todos modos?
  • Unity Error: Error al crear el reproductor
  • ¿Cómo solucionarlo? El código de la versión de su APK debe ser superior a 2. "en la Consola para desarrolladores de Google Play.
  • Las sumas de comprobación MD5 de los archivos APK de Android difieren. ¿Por qué?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.