Italian Download e dintorni

Vittorio

Member
Licensed User
Longtime User
Ciao a tutti,

Ho un problema con HttpUtils2: ho bisgno di poter effettuare frequenti upgrade dell'applicazione e, allo stesso tempo, informare gli utenti del rilascio di nuove versioni. Ho analizzato il problema e ho deciso di seguire questo schema:

1 - Creo un file di testo con il numero della nuova versione
2 - Forzo l'app a scaricare all'apertura il file di testo
3 - Estraggo dal file in numero della nuova versione
4 - Confronto il numero della nuova versione con quello della versione in uso
5 - Se la versione è diversa, deve essere effettuato il download e l'installazione.

Tutto bene fino al punto 5: l'applicazione mi restituisce un errore (Errore di analisi, Errore durante l'analisi del pacchetto) e non effettua il download. Dov'è l'errore? Perchè riesco a scaricare tranquillamente il file di testo ma non riesco a scaricare l'applicazione? Qui sotto ho incluso il sorgente dell'applicazione di prova per il dowload: non è altro che un "riadattamento" dell'esempio di Erel su HttpUtils2 (ooviamente, pr funzionare l'applicazione ha bisogno dei moduli HttpJob e HttpUtils2Service.

B4X:
Sub Process_Globals
   Dim VerVersion As String
   Dim VersionString As String
   Dim VersionCode As String
   Dim NewPack As String
   VerVersion = "http://www.miosito.com/miofileditesto.txt"
   NewPack= "http://www.miosito.com/miaapp.apk"
   Dim Scaricato As Boolean
End Sub

Sub Globals
   Dim EditText1 As EditText
End Sub

Sub Activity_Create(FirstTime As Boolean)
   Dim job1, job2, job3 As HttpJob
   Dim pm As PackageManager 
   Activity.LoadLayout("layout")
   Scaricato=False
   VersionCode=pm.GetVersionCode("it.miaversioncode")
   VersionString=pm.GetVersionName("it.miaversionname")
   
   job1.Initialize("Job1",Me)
   job1.Download(VerVersion)
   
End Sub

Sub JobDone (Job As HttpJob)
   If Job.Success = True Then
      Select Job.JobName
         Case "Job1"
            EditText1.Text=Job.GetString
            Msgbox (EditText1.text,"")
            If EditText1.Text<>VersionString Then 
               Job.Download(NewPack)
               Dim i As Intent
               i.Initialize(i.ACTION_VIEW, "file://" & File.Combine(File.DirRootExternal, "miaapp.apk"))
               i.SetType("application/vnd.android.package-archive")
               StartActivity(i)   
               'Scaricato=True
            End If
      End Select
   Else
      Log("Error: " & Job.ErrorMessage)
      ToastMessageShow("Error: " & Job.ErrorMessage, True)
   End If
   Job.Release
End Sub

Grazie a chi vorrà darmi un mano,
Vittorio
 

gdelvecchio

Member
Licensed User
Longtime User
Download pacchetto

Ciao
io darei un'occhiata al settype che gli passi.

sei sicuro che sia quello giusto?

dai un'occhiata qui se non lo hai già fatto:
http://www.b4x.com/forum/basic4android-getting-started-tutorials/9823-list-known-android-intents-do-stuff.html#post54417

io per fare i download e aprire il file nel job done chiamo un'altro metodo e gli passo il nome del file:

B4X:
Sub OpenFile(Nome_file As String)
   'APRO IL FILE
    Dim i As Intent 'Requires a reference to the Phone library
    Dim uri As String
    If File.Exists(File.DirDefaultExternal, Nome_file) Then
        uri = "file://" & File.Combine(File.DirDefaultExternal, Nome_file)
        'Msgbox(uri,"test")
        i.Initialize(i.ACTION_VIEW, uri)
        
      If Nome_file.Contains(".pdf")Then
        i.SetType("application/pdf")
      End If 
      
      If Nome_file.Contains(".xls")Then
        i.SetType("application/vnd.ms-excel")
      End If 
      
      If Nome_file.Contains(".doc")Then
        i.SetType("application/msword")
      End If 
      
        If Nome_file.Contains(".jpg") OR Nome_file.Contains(".png") Then
        i.SetType("image/*")
      End If 
      
        i.WrapAsIntentChooser("Apri con:")
        StartActivity(i)
    End If
End Sub

Spero di esserti stato di aiuto

Ciao
 

marcick

Well-Known Member
Licensed User
Longtime User
Risposta magari impertinente, ma .. io me la sono menata tanto e alla fine senza reinventare la ruota mi sono rassegnato a usare il playstore. Tutto sommato funziona bene e nel giro di 3/4 ore dalla pubblicazione l'app è disponibile.
E per avvisare prontamente gli utenti (casomai l'app non fosse in aggiornamento automatico) le notifiche push funzionano bene http://www.b4x.com/forum/basic4andr...push-notification-gcm-framework-tutorial.html
Ciao
Marco
 

maxware

Well-Known Member
Licensed User
Longtime User
Ciao Vittorio.
Ho visto il tuo esempio e volevo provarlo ( premetto che di pagine web ne capisco poco )
Il fatto di prelevare un file di testo da un sito per leggerlo dall' app mi "intriga " per la nuova release di alfadesk che sto facendo
Ho scopiazzato il tuo codice e cercato i moduli httputils2 HttpJob ma cavolaccio e' da un po che cerco di trovare i moduli in oggetto ma non li trovo. Avete il link sotto mano per cortesia
grazie 10*10*10
Mamo
 

gdelvecchio

Member
Licensed User
Longtime User

Vittorio

Member
Licensed User
Longtime User
HttpUtils2

Ciao Vittorio.
Ho visto il tuo esempio e volevo provarlo ( premetto che di pagine web ne capisco poco )
Il fatto di prelevare un file di testo da un sito per leggerlo dall' app mi "intriga " per la nuova release di alfadesk che sto facendo
Ho scopiazzato il tuo codice e cercato i moduli httputils2 HttpJob ma cavolaccio e' da un po che cerco di trovare i moduli in oggetto ma non li trovo. Avete il link sotto mano per cortesia
grazie 10*10*10
Mamo


Ciao Mamo,

Scarica HttpUtils2 da qui. Ci trovi il progetto completo e, ovviamente, i moduli che ti interessano.

Spero ti sia utile,
Vittorio
 

Vittorio

Member
Licensed User
Longtime User
Risposta magari impertinente, ma .. io me la sono menata tanto e alla fine senza reinventare la ruota mi sono rassegnato a usare il playstore. Tutto sommato funziona bene e nel giro di 3/4 ore dalla pubblicazione l'app è disponibile.
E per avvisare prontamente gli utenti (casomai l'app non fosse in aggiornamento automatico) le notifiche push funzionano bene http://www.b4x.com/forum/basic4andr...push-notification-gcm-framework-tutorial.html
Ciao
Marco

Ciao Marco,

Non posso usare il playstore per questa applicazione perchè si tratta di una app aziendale che non posso far scaricare a tutti (accede a un DB).

Grazie comunque per il suggerimento,
Vittorio
 

Vittorio

Member
Licensed User
Longtime User
Ciao
io darei un'occhiata al settype che gli passi.

sei sicuro che sia quello giusto?

dai un'occhiata qui se non lo hai già fatto:
http://www.b4x.com/forum/basic4android-getting-started-tutorials/9823-list-known-android-intents-do-stuff.html#post54417

io per fare i download e aprire il file nel job done chiamo un'altro metodo e gli passo il nome del file:

B4X:
Sub OpenFile(Nome_file As String)
   'APRO IL FILE
    Dim i As Intent 'Requires a reference to the Phone library
    Dim uri As String
    If File.Exists(File.DirDefaultExternal, Nome_file) Then
        uri = "file://" & File.Combine(File.DirDefaultExternal, Nome_file)
        'Msgbox(uri,"test")
        i.Initialize(i.ACTION_VIEW, uri)
        
      If Nome_file.Contains(".pdf")Then
        i.SetType("application/pdf")
      End If 
      
      If Nome_file.Contains(".xls")Then
        i.SetType("application/vnd.ms-excel")
      End If 
      
      If Nome_file.Contains(".doc")Then
        i.SetType("application/msword")
      End If 
      
        If Nome_file.Contains(".jpg") OR Nome_file.Contains(".png") Then
        i.SetType("image/*")
      End If 
      
        i.WrapAsIntentChooser("Apri con:")
        StartActivity(i)
    End If
End Sub

Spero di esserti stato di aiuto

Ciao

Ciao e grazie per il codice che hai postato,

Confesso che, a questo punto, sono davvero confuso!! Cerco di fare un po' di chiarezza (soprattutto con me stesso). Cosa ottengo con il codice che ho postato? Riesco a leggere un file di testo che scarico dal mio sito e che mi conferma che devo installare una nuova versione dell'applicazione (perchè il valore scritto sul file di testo è diverso dal valore della versione installata). Bene, fino a questo punto ci siamo.

Adesso cominciano i problemi; non so come scaricare fisicamante un file, parcheggiarlo nella dir "download" della SD card e installarlo automaticamente (dopo aver chiesto l'autorizzazione). Ecco, io qui sono piantato come un TIR con le 4 frecce....

Lo so che sono uno zuccone e la soluzione magari è dietro l'angolo, ma non ci arrivo proprio.

Vittorio
 

Vittorio

Member
Licensed User
Longtime User
Ciao Vittorio
ero gia' andato in quel link ma non c'e la HttpJob

Ciao Max,

Magari dico una sciocchezza ma quello che cerchi non è già "dentro" i moduli distribuiti con il progetto HttpUtils2? Forse ho capito male io, scusami.

Buon lavoro,
Vittorio
 

Vittorio

Member
Licensed User
Longtime User
Ciaooo
Ho creato un nuovi progetto con l'aggiunta dei seguenti moduli : HttpUtils e HttpUtilsService e non mi riconosce
dim job as httpjob
mi manca di sicuro una libreria / classe ma non so dove perscarla

Ciao Mamo,

Permettimi di insistere: stai usando HttpUtils e NON HttpUtils2 il modulo HttpJob si trova all'interno del progetto HtppUtils2.

Qui sotto trovi il modulo di classe HttpJob:

B4X:
'HttpUtils2 version 2.00
'Class module
Sub Class_Globals
   Public JobName As String
   Public Success As Boolean
   Public Username, Password As String
   Public ErrorMessage As String
   Private target As Object
   Private mLink As String
   Private taskId As String
   Private req As HttpRequest
End Sub

'Initializes the Job.
'Name - The job's name. Note that the name doesn't need to be unique.
'TargetModule - The activity or service that will handle the JobDone event.
Public Sub Initialize (Name As String, TargetModule As Object)
   JobName = Name
   target = TargetModule
End Sub
'Sends a POST request with the given data as the post data.
Public Sub PostString(Link As String, Text As String)
   PostBytes(Link, Text.GetBytes("UTF8"))
End Sub

'Sends a POST request with the given string as the post data
Public Sub PostBytes(Link As String, Data() As Byte)
   mLink = Link
   req.InitializePost2(Link, Data)
   CallSubDelayed2(HttpUtils2Service, "SubmitJob", Me)
End Sub

'Sends a POST request with the given file as the post data.
'This method doesn't work with assets files.
Public Sub PostFile(Link As String, Dir As String, FileName As String)
   Dim length As Int
   If Dir = File.DirAssets Then
      Log("Cannot send files from the assets folder.")
      Return
   End If
   length = File.Size(Dir, FileName)
   Dim In As InputStream
   In = File.OpenInput(Dir, FileName)
   If length < 1000000 Then '1mb
      'There are advantages for sending the file as bytes array. It allows the Http library to resend the data
      'if it failed in the first time.
      Dim out As OutputStream
      out.InitializeToBytesArray(length)
      File.Copy2(In, out)
      PostBytes(Link, out.ToBytesArray)
   Else
      req.InitializePost(Link, In, length)
      CallSubDelayed2(HttpUtils2Service, "SubmitJob", Me)   
   End If
End Sub
'Submits a HTTP GET request.
'Consider using Download2 if the parameters should be escaped.
Public Sub Download(Link As String)
   mLink = Link
   req.InitializeGet(Link)
   CallSubDelayed2(HttpUtils2Service, "SubmitJob", Me)
End Sub
'Submits a HTTP GET request.
'Encodes illegal parameter characters.
'<code>Example:
'job.Download2("http://www.example.com", _
'   Array As String("key1", "value1", "key2", "value2"))</code>
Public Sub Download2(Link As String, Parameters() As String)
   mLink = Link
   Dim sb As StringBuilder
   sb.Initialize
   sb.Append(Link)
   If Parameters.Length > 0 Then sb.Append("?")
   Dim su As StringUtils
   For i = 0 To Parameters.Length - 1 Step 2
      If i > 0 Then sb.Append("&")
      sb.Append(su.EncodeUrl(Parameters(i), "UTF8")).Append("=")
      sb.Append(su.EncodeUrl(Parameters(i + 1), "UTF8"))
   Next
   req.InitializeGet(sb.ToString)
   CallSubDelayed2(HttpUtils2Service, "SubmitJob", Me)      
End Sub

'Called by the service to get the request
Public Sub GetRequest As HttpRequest
   Return req
End Sub

'Called by the service when job completes
Public Sub Complete (id As Int)
   taskId = id
   CallSubDelayed2(target, "JobDone", Me)
End Sub

'Should be called to free resources held by this job.
Public Sub Release
   File.Delete(HttpUtils2Service.TempFolder, taskId)
End Sub

'Returns the response as a string encoded with UTF8.
Public Sub GetString As String
   Return GetString2("UTF8")
End Sub

'Returns the response as a string.
Public Sub GetString2(Encoding As String) As String
   Dim tr As TextReader
   tr.Initialize2(File.OpenInput(HttpUtils2Service.TempFolder, taskId), Encoding)
   Dim res As String
   res = tr.ReadAll
   tr.Close
   Return res
End Sub

'Returns the response as a bitmap
Public Sub GetBitmap As Bitmap
   Dim b As Bitmap
   b = LoadBitmap(HttpUtils2Service.TempFolder, taskId)
   Return b
End Sub

Sub GetInputStream As InputStream
   Dim In As InputStream
   In = File.OpenInput(HttpUtils2Service.TempFolder, taskId)
   Return In
End Sub

Ciao,
Vittorio
 

marcick

Well-Known Member
Licensed User
Longtime User
Ciao Marco,

Non posso usare il playstore per questa applicazione perchè si tratta di una app aziendale che non posso far scaricare a tutti (accede a un DB).

Grazie comunque per il suggerimento,
Vittorio

Si, immaginavo avessi dei buoni motivi. Io ho digerito il Playstore perchè ho comunque poi un controllo online delle licenze e solo chi decido io riesce di fatto ad avviarla ed utilizzarla (almeno spero ...).
Ciao
Marco
 

Vittorio

Member
Licensed User
Longtime User
....Devo andare decisamente in ferie....
Risolto , leggo il file sul mio web tutto ok. Domandina Domandina. ma dove piazza il file scaricato ?? Ho cercato in tutto il Note II ma non trovo il file

Ciao Mamo,

Hai centrato il punto: era questo il problema per il quale chiedevo aiuto!!!! Riesco ad aprire e leggere i files ma non riesco a salvare. Ho fatto anche ricerche all'interno del telefono ma i files scaricati (se sono stati scaricati) non li trova. E' un vero mistero!! Se avrò novità le condividerò sul questo thread, fai lo stesso tu, per favore.

Ciao e buon lavoro,
Vittorio
 

gdelvecchio

Member
Licensed User
Longtime User
Ciao Max e Vittorio

Come vi accennavo in un post precedente conosco molto bene la libreria in questione.

Adesso vi spiego il tutto!

E' il servizio che copia il file, o meglio è nel servizio che viene impostato la directory di download.

Se aprite HTTPUTILS2SERVICE vedrete che nel Service_Create viene indicato il tempfolder.
B4X:
Sub Service_Create
   TempFolder = File.DirInternalCache
   hc.Initialize("hc")
   TaskIdToJob.Initialize
End Sub

Qui indichiamo la directory dove salviamo il file, di default viene utilizzata la internalcache.

In questo esempio che vi posto, alla fine viene richiamato il Job.release.
Se andate a vedere nella libreria HTTPJOB, qui viene cancellato il file dopo il download, quindi prima del release si deve copiare il file o farne quello che volete.

Di seguito il codice del metodo Release
B4X:
'Should be called to free resources held by this job.
Public Sub Release
   File.Delete(HttpUtils2Service.TempFolder, taskId)
End Sub

io ho modificato un pò tutto a mio piacimento ma vi posto il metodo JobDone con il download del file e l'apertura.

Codice del JobDone:

B4X:
Sub JobDone (Job As HttpJob)

    Log("Nome Job = " & Job.JobName & ", Esito = " & Job.Success)
    If Job.Success = True Then
        Select Job.JobName
            Case "Job1"
         
         'Intercetto il file del download e lo copio
         Dim out As OutputStream
         out = File.OpenOutput(File.DirDefaultExternal,DOWNLOAD_FILENAME,False )
         File.Copy2(job1.GetInputStream, out)
         out.Close
         
         Log("Download OK!")
         ProgressDialogHide
         
         'apro il file 
         OpenFile(DOWNLOAD_FILENAME)
        End Select
    Else
        Log("Error: " & Job.ErrorMessage)
        ToastMessageShow("Error: " & Job.ErrorMessage, True)
    End If
   
   ' QUI VIENE CANCELLATO IL FILE VEDERE HTTPJOB.RELEASE SE SI VUOLE MODIFICARE
    Job.Release
   
End Sub

Mi sembra di aver già postato il codice del metodo che ho fatto per aprire il file.

se volete vi posto di nuovo anche quello!

Fatemi sapere e spero di avervi tolto tutti i dubbi.

Io uso il tutto in una applicazione che lavora con un documentale dietro e funziona alla grande!!!!

Ciao e spero di essere stato utile
 

gdelvecchio

Member
Licensed User
Longtime User
Figurati MAMO!!!

Se vuoi una mano su come proggere le aree web da dove scarichi i file fammi un fischio.

Con il file .htaccess fai quello che vuoi!!!

Ciao e buon lavoro

Gianlu
 

gdelvecchio

Member
Licensed User
Longtime User
Non c'è mai problema Luigi

Posta pure l'esempio e appena riesco ne creo uno io.

Ciao
 
Top