Android – Aggiornare la mia App senza l’utilizzo del Play Store (Parte 1)

Come facciamo ad aggiornare la nostra applicazione Android in un Rete Aziendale senza accesso ad Internet e quindi senza l’appoggio del Play Store di Google? Dopo aver effettuato delle ricerche senza una risposta ben precisa ho deciso di effettuare manualmente tutti gli step sfruttando le mie REST API (in Java) interne:

  1. Richiesta alle API per il codice dell’ultima versione della mia App.
  2. Confronto sul Device tra la versione installata e l’ultima rilasciata.
  3. Download del pacchetto di installazione dell’App aggiornata.
  4. Installazione sul Device.

Quello che vi mostrerò in questo post saranno i punti 1 e 3, cioè i due metodi da inserire nelle nostre API per la richiesta del codice di versione e il download del pacchetto APK.

RICHIESTA CODICE DELL’ULTIMA VERSIONE DELLA MIA APP

Se non vogliamo utilizzare un Database o un file di testo per ottenere il codice dell’ultima versione, ma andare direttamente nell’AndroidManifest all’interno dell’APK è necessario utilizzare un jar chiamato APKParser. Se provassimo infatti a recuperare manualmente il file XML scopriremmo che il contenuto risulta illeggibile, con questo jar invece ci sarà possibile ottenere il contenuto semplicemente con il metodo AXMLPrinter.getManifestXMLFromAPK. Il jar è reperibile a questo indirizzo.

	@GET
	@Path("/getAppVersion")
	public Response getAppVersion()
	{
		//Recupero il path dove si trova il mio apk all'interno del server
		String pathFiles = this.getClass().getResource("/").toURI().getPath().replace("WEB-INF/classes", "") + "MyApp.apk";
		//Recupero il contenuto del file AndroidManifest.xml all'interno dell'apk
		String manifest = AXMLPrinter.getManifestXMLFromAPK(pathFiles);

		DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
		Document doc = dBuilder.parse(new ByteArrayInputStream(manifest.getBytes("UTF-8")));
		doc.getDocumentElement().normalize();

		NodeList nodes = doc.getElementsByTagName("manifest");

		for (int i = 0; i < nodes.getLength(); i++)
		{
			Element e = (Element) nodes.item(i);
			String versionCode = e.getAttribute("android:versionCode");

			if (!versionCode.equals(""))
				return Response.ok(versionCode, MediaType.APPLICATION_JSON).build();
		}
		return Response.ok("0", MediaType.APPLICATION_JSON).build();

	}

Alla fine all’interno della variabile versionCode ci sarà il codice dell’ultima versione rilasciata dell’apk sul mio server.

DOWNLOAD APP

Se il device ha una versione vecchia dell’app installata verrà inviata la richiesta al server per il download del nuovo APK. Mi raccomando inserite nel metodo il content-type di risposta come segue: application/vnd.android.package-archive

	@GET
	@Path("/downloadApp")
	@Produces({ "application/vnd.android.package-archive" })
	public Response downloadApp()
	{
		try
		{
			String pathFile = this.getClass().getResource("/").toURI().getPath().replace("WEB-INF/classes", "") + "MyApp.apk";
			File file = new File(pathFile);

			ResponseBuilder response = Response.ok((Object) file);
			response.header("Content-Disposition",
				"attachment; filename=\"MyApp.apk\"");
			return response.build();
		}
		catch (Exception ex)
		{
			return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
		}
	}

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *