Italian [RISOLTO] Aggiornare l'app eseguendo il nuovo apk dall'interno di se stessa

Sabotto

Active Member
Licensed User
E' possibile lanciare l'installazione di un aggiornamento di una propria app dall'interno della stessa?
Supponiamo che io abbia scaricato il nuovo file apk da un mio host e lo abbia copiato in xui.DefaultFolder
Per eseguirlo ho trovato questi due spezzoni di codice ma non mi funziona nessuno dei due.
Premetto che sto usando B4XPages

B4X:
'Primo spezzone
Dim Intent1 As Intent
Dim Target as String
Target = "file://" & File.Combine(xui.DefaultFolder, "nuovoapk.apk")     
Intent1.Initialize(Intent1.ACTION_VIEW, Target)     
Intent1.SetType("application/vnd.android.package-archive")
StartActivity(Intent1)
'qui ottengo l'errore
'android.os.FileUriExposedException: file:///data/user/0/b4a.NewAPK/files/znuovoapk.apk exposed beyond app through Intent.getData()
 
'Secondo spezzone
Dim Intent1 As Intent
Dim Target as String
Target = File.Combine(xui.DefaultFolder, "nuovoapk.apk")
Intent1.Initialize(Intent1.ACTION_VIEW, Target) 
Intent1.SetComponent("com.android.packageinstaller/.PackageInstallerActivity")
StartActivity(Intent1)
'qui ottengo l'errore
'android.content.ActivityNotFoundException: Unable to find explicit activity class {com.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity};
' have you declared this activity in your AndroidManifest.xml?
Come si vede differiscono perche a uno viene usato SetType e ad un altro SetComponent, oltre che nella sintassi del Target
Come posso fare?
 
Last edited:

amorosik

Expert
Licensed User
Pare che per l'installazione apk sia necessaria la conferma da parte operatore
Inzomma senza l'ometto che digita, nun se po' fa'
Comunque sul forum credo si trovino anche i sorgenti dell'app B4A-bridge
Controllare come fa quella per installare un apk credo sia la cosa migliore
 

Sabotto

Active Member
Licensed User
Ma che esca la richiesta di conferma all'utente che deve accettare a me va bene.
Perche dici che non si puo fare?
Comunque sto dando uno sguardo alla libreria di udg, questa
 

amorosik

Expert
Licensed User
Ma che esca la richiesta di conferma all'utente che deve accettare a me va bene.
Perche dici che non si puo fare?
Comunque sto dando uno sguardo alla libreria di udg, questa

Perche' se hai diversi dispositivi da aggiornare sei COSTRETTO ad andare davanti ognuno e digitare 'ok vai'
Non e' possibile impostare un automatismo che aggiorni l'appa
In generale, non poter fare qualcosa, a mio avviso e' una limitazione
Che poi sia fatto per ragioni di sicurezza, e' comprensibile
Non e' giustificabile che in qualche modo, essendo autorizzati con certificati o altro, non si possa bypassare questo limite
 

Sabotto

Active Member
Licensed User
E' un'app che ho creato per dei dipendenti di una società.
Ogni volta che faccio una modifica devo chiamarli per farli passare da me , inviargli l'apk sul whatsapp e poi installargliela io da "Archivio" (perchè direttamente da wapp cliccando sull'apk non si installa), perchè loro non sanno farlo.
Perche' se hai diversi dispositivi da aggiornare sei COSTRETTO ad andare davanti ognuno e digitare 'ok vai'
Non ho capito questo passaggio. Sarebbe "costretto" ogni singolo utilizzatore a fare l'ok all'installazione, mica io. Che vuoi dire andare davanti ognuno?
 

Sabotto

Active Member
Licensed User
Ritornando alla prova della libreria di @udg, nel suo esempio di prova ottengo l'errore
B4X:
PARSE ERROR:
unsupported class file version 53.0
...while parsing META-INF/versions/9/module-info.class
1 error; aborting
@Lello1964 che l'ha usata o lo stesso @udg , se leggono, possono aiutarmi?
 

Xfood

Expert
Licensed User
Scusami se mi intrometto,
Hai diverse possibilita' checsicuramente hai vagliato.
1) pubblichi la tua app sul playstore, cosi si aggiorna automaticamente ogni volta che rilasci un aggiornamento.

2) se il dispositivo non ha il playstore, puoi provare questa soluzione, ottima ed economica

3) utilizzare come gia suggerito la classe di @udg , e crearti una tua funzione che scarica un apk dal tuo server ftp e aggiorna l'app, richiedendo solo una conferma da parte dell'utente
 

Sabotto

Active Member
Licensed User
Infatti, volevo usare la soluzione 3)
Ma come ho gia scritto nel post #7, non riesco a far funzionare l'esempio
 
Last edited:

udg

Expert
Licensed User
Longtime User
Ciao,
credo che l'errore dipenda dal fatto che hai utilizzato la libreria già compilata. Prova a partire dal sorgente (ricorda che l'ultima versione disponibile è la 2.05).
Strano che faccia riferimento ad Android 9. Io ho solo 8 e, di recente, 11 (usato solo con B4J, per di più)
Facci sapere.

ps: avendo il sorgente, nulal ti impedisce di prendere solo i pezzi che ti interessano ed integrarli direttamente nella tua app, facendo a meno della libreria.
 
Last edited:

Sabotto

Active Member
Licensed User
Ciao,
credo che l'errore dipenda dal fatto che hai utilizzato la libreria già compilata. Prova a partire dal sorgente (ricorda che l'ultima versione disponibile è la 2.05).
Strano che faccia riferimento ad Android 9. Io ho solo 8 e, di recente, 11 (usato solo con B4J, per di più)
Facci sapere.

ps: avendo il sorgente, nulal ti impedisce di prendere solo i pezzi che ti interessano ed integrarli direttamente nella tua app, facendo a meno della libreria.
Ok. Devo comunque integrare il.manifest o non occorre ?
 

udg

Expert
Licensed User
Longtime User
Sì, certo.
Il Manifest con il Service costituiscono la coppia che dice al sistema operativo di risvegliare la tua app quando viene aggiornata.
Guarda tra gli ultimi post di quel thread per una versione aggiornata dei passi da seguire.
 

Sabotto

Active Member
Licensed User
Allora: Ho eliminato il riferimento alla libreria ed ho aggiunto al progetto i due moduli (cl_appupdate.bas e newinst2.bas)
Ho inserito dei riferimenti a librerie che l'IDE mi segnalava mancanti (OkHttp, OkHttpUtils2, RuntimePermission e Reflection)
Ma avviando in modalità debug, ottengo sempre lo stesso errore:

Compilazione del codice Java prodotto. (0.01s)
Conversione byte code - ottimizzazione dex. Error
PARSE ERROR:
unsupported class file version 53.0
...while parsing META-INF/versions/9/module-info.class
1 error; aborting


Suggerimenti?

Edit: Ho anche creato un nuovo progetto B4X (quello demo era fatto con Activity), ho aggiunto i moduli e le lbrerie ed ho cambiato una linea di codice dove c'era il riferimentio ad Activity sostituendo Root. Ma l'errore è sempre lo stesso. 😢
 
Last edited:

amorosik

Expert
Licensed User
E' un'app che ho creato per dei dipendenti di una società.
Ogni volta che faccio una modifica devo chiamarli per farli passare da me , inviargli l'apk sul whatsapp e poi installargliela io da "Archivio" (perchè direttamente da wapp cliccando sull'apk non si installa), perchè loro non sanno farlo.

Non ho capito questo passaggio. Sarebbe "costretto" ogni singolo utilizzatore a fare l'ok all'installazione, mica io. Che vuoi dire andare davanti ognuno?

Intendo dire che NON si riesce a fare un'installazione apk automatizzata
Se tu avessi dei clienti che hanno installato sul telefono un'app per ordinare le pizze (ad esempio) e metti l'aggiornamento disponibile (non su PlayStore ma su tuo sito web) per installare quell'aggiornamento il lciente deve farlo a manina, non e' possibile far si che la tua app installata lanci e concluda l'installazione di altra app, o di un suo aggiornamento
E questo e' un limite che mi piacerebbe superare in qualche modo

Per quanto riguarda il tuo problema, e' sufficiente inserire il link al tuo apk da qualche parte nell'app
Quando segnali che e' disponibile un aggiornamento, l'operatore puo' cliccare sul link e partira' il browser web che scarichera' l'apk aggiornamento
Alla fine scaricamento, verra' chiesto all'operatore di avviarlo in esecuzione e via andare
Non c'e' bisogno di nessuna libreria per fare il lavoro essenziale (scaricamento in locale aggiornamento, avvio in esecuzione,...)
L'ho provata anch'io la libreria e funziona correttamente, fa molte cose in piu' dello stretto indispensabile, tipo controllo versioni differenti, ecc..
Poi in realta' non l'ho usata mi sembrava troppa roba rispetto al semplice aggiornamento che stavo cercando
 

Sabotto

Active Member
Licensed User
Alla fine scaricamento, verra' chiesto all'operatore di avviarlo in esecuzione e via andare
E' proprio questa la parte che non saprei come fare.
Se ho il scaricato file .apk nella cartella (suppiamo xui.DefaulFolder), poi come faccio a far si che l'operatore la installi?
Devo farlo da codice, immagino. E ritorniamo al problema che descrivevo nel primo post.
 

amorosik

Expert
Licensed User
E' proprio questa la parte che non saprei come fare.
Se ho il scaricato file .apk nella cartella (suppiamo xui.DefaulFolder), poi come faccio a far si che l'operatore la installi?
Devo farlo da codice, immagino. E ritorniamo al problema che descrivevo nel primo post.

Non c'e' niente da fare, finito lo scaricamento 'vedendo' un apk il sistema operativo cerca di avviarlo
Puoi fare la prova con un semplice test:
- metti un tuo apk su un qualsiasi sito web
- dal telefono avvii un browser e vai in cerca di quel file
- quando lo trovi ci doppio-cliccki sopra per scaricarlo

Vedrai che Android alla fine scaricamento lo avviera' e ti chiedera' se proseguire oppure no
Scaricando via codice non so se faccia lo stesso effetto
 

Sabotto

Active Member
Licensed User
Sono riuscito a lanciare l'esempio della libreria di udg.
L'ho scremata (usando solo la classe e le routine necessarie) da tutto cio che non mi occorre e pare funzionare bene.
L'errore che lamentavo al post #7, questo
--------------------------------------------------------------
unsupported class file version 53.0
...while parsing META-INF/versions/9/module-info.class
1 error; aborting
---------------------------------------------------------------
ho poi scoperto che mi succedeva solo sul pc del lavoro e non in quello di casa (Entrambi con Win10)
Alla fine la soluzione l'ho trovata qui (e la riporto nel caso succedesse a qualcun altro.)
 

Star-Dust

Expert
Licensed User
Longtime User
Ho trovato anche questa soluzione
 
Top