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.
- ¿Cómo puedo exportar un apk firmado con el certificado de depuración?
- Copiar android .apk a otro archivo .apk a través de código java y sobre-montar sus archivos de activos?
- Cómo convertir archivos .apk a java
- Error de aplicación no instalada
- Cómo deshabilitar generado firmado apk android Studio?
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.
- Cómo construir apk sin eclipse o Modificar el edificio apk con un archivo de configuración?
- Aapt.exe está lanzando una excepción no controlada mientras construye el archivo * .apk para el proyecto de Android en Eclipse
- Cómo salir de APK de shell
- No se puede descargar e instalar la aplicación APK desde la página web propia
- Android Play Store Error -505
- Cómo instalar el archivo .apk en el dispositivo Android
- Automatizado APK publicar en Android Market
- Agrupar varias aplicaciones en una sola aplicación
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; }