Pregunta

Estoy trabajando en una aplicación de Android para mi empresa que se conecta a un dispositivo de video Bluetooth. Una empresa de terceros con la que estamos trabajando construyó la cámara Bluetooth y ha creado un servicio (servicio de Android) con el que nuestra aplicación se conecta a la que usamos para interactuar con la cámara. Esta compañía no quería que tuviéramos acceso al código fuente, por lo que crearon un SDK en forma de un servicio que debe instalarse en el teléfono para interacción con la cámara. Si el servicio (que es solo un APK) no está instalado, nuestra aplicación no funcionará.

Sin embargo, podemos detectar que el servicio no existe y luego proceder a obtener el APK y ahora estamos tratando de descubrir la mejor manera de hacerlo. ¿Es posible que podamos hacer que la otra compañía publique este servicio en el mercado de Android a pesar de que no tiene interfaz de usuario y cuando se instale no hacer nada? ¿Puedes poner algo en el mercado de Android y no hacer que aparezca en filtros normales (lo que significa que la única forma de llegar sería yendo directamente a la página?). No creo que quieran que las personas lo insten, ya que la compañía de terceros vende su propia cámara (casi lo mismo que la que nos hacen) y tienen aplicaciones en el mercado para ello.

La otra posibilidad es que alojemos el archivo nosotros mismos y lo descargamos cuando el usuario instale por primera vez la aplicación. Sin embargo, el problema con eso es que tenemos que descubrir nuestra propia metodología para actualizaciones.

¿Alguien tiene experiencia con esto o tiene alguna idea de cuál podría ser la mejor manera de manejar nuestra situación?

¿Fue útil?

Solución 2

Terminé resolviendo el problema agrupando el servicio APK en la carpeta /activos de mi aplicación. Puede leer de esos datos como InputStream y escribirlos en SDCard donde luego puede iniciar la intención de instalar el APK. Todo lo que el usuario tiene que hacer es hacer clic en Instalar (siempre que tengan aplicaciones de terceros permitidas, lo que tampoco está en el mercado.

public static final String SERVICE_APK_FILENAME = "SomeService.apk";

protected void installService() {

    File apk = getServiceFileOnDisk();
    if (!apk.exists()) {
        try {
            writeServiceToFile();
        } catch (Exception ex) {
            Log.e(TAG, "", ex);                
            return;
        }
    }

    Intent promptInstall = new Intent(Intent.ACTION_VIEW);
    promptInstall.setDataAndType(Uri.fromFile(getServiceFileOnDisk()),
            "application/vnd.android.package-archive");
    startActivityForResult(promptInstall, REQUEST_INSTALL_APK);
}

protected File getServiceFileOnDisk() {
    return new File(Util.getAppStorageDirectory(this), SERVICE_APK_FILENAME);
}

protected void writeServiceToFile() throws IOException {
    File apk = getServiceFileOnDisk();
    InputStream assetIs = mAssetMgr.open(SERVICE_APK_FILENAME);
    OutputStream out = new FileOutputStream(apk);
    // Transfer bytes from in to out
    byte[] buf = new byte[4 * 1024];
    int len;
    while ((len = assetIs.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    assetIs.close();
    out.close();       
}

Entonces, lo que sucede es cuando la aplicación se lanza por primera vez, verifico si el servicio necesita ser instalado (o actualizado). Ese código es un poco más complejo y fuera del alcance de lo que estoy haciendo aquí, así que no lo publiqué. Pero si determino que el servicio debe instalarse, le solicito al usuario con un cuadro de diálogo y si hacen clic en Aceptar, llamo al método InstallService que se muestra arriba.

Otros consejos

Si se encuentra en esa situación, le recomiendo alojar el APK desde el servidor de su empresa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top