Autore Topic: FileConnection API  (Letto 661 volte)

Offline Ale83

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG OPTIMUS ONE, v. Android 2.2.1 Froyo
  • Sistema operativo:
    Windows XP - SP2
FileConnection API
« il: 07 Luglio 2011, 11:25:58 CEST »
0
Ciao, ho un problema con la FileConnection API su Android. Ho convertito un applicazione javame in Android da qui: http://www.netmite.com/android/srv/2.0/getapk.php, ottenendo un file .apk da installare sul mio smartphone con android 2.2

L'applicazione funziona ad eccezione della parte riguardante l'accesso a dati salvati nella SD tramite l'API FileConnection, una volta selezionato un file presente in memoria visualizzo un errore: no data on stream.

Forse l'API FileConnection implementata in javame non è compatibile con Android ? Se così fosse, come posso risolvere ?

grazie


Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:FileConnection API
« Risposta #1 il: 07 Luglio 2011, 11:44:35 CEST »
0
Ciao, ho un problema con la FileConnection API su Android. Ho convertito un applicazione javame in Android da qui: http://www.netmite.com/android/srv/2.0/getapk.php, ottenendo un file .apk da installare sul mio smartphone con android 2.2

L'applicazione funziona ad eccezione della parte riguardante l'accesso a dati salvati nella SD tramite l'API FileConnection, una volta selezionato un file presente in memoria visualizzo un errore: no data on stream.

Forse l'API FileConnection implementata in javame non è compatibile con Android ? Se così fosse, come posso risolvere ?

Mi spiace, non so proprio come aiutarti.  :-(

I moderatori (gli altri) sono geniali e talvolta hanno anche sprazzi di chiaroveggenza, ma riuscirebbero davvero a stupirmi se riuscissero a trovarti la soluzione al problema, senza vedere una riga di codice.  :-)
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Ale83

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG OPTIMUS ONE, v. Android 2.2.1 Froyo
  • Sistema operativo:
    Windows XP - SP2
Re:FileConnection API
« Risposta #2 il: 07 Luglio 2011, 12:03:51 CEST »
0
Hai perfettamente ragione, allora ecco ciò che ho realizzato con JavaME :

Codice (Java): [Seleziona]
/**
* mostra  all'utente il contenuto della directory corrente
*/


  void showCurrDir()
  {
    Enumeration e;
    FileConnection currDir = null;
    List browser;
    try
    {
      if (MEGA_ROOT.equals(currDirName))
      {
        e = FileSystemRegistry.listRoots();
        browser = new List(currDirName, List.IMPLICIT);
      }
      else
      {
          currDir = (FileConnection)Connector.open(
          "file://localhost/" + currDirName);
        e = currDir.list();
        browser = new List(currDirName, List.IMPLICIT);
        browser.append(UP_DIRECTORY,null);
      }
      while (e.hasMoreElements())
      {
        String fileName = (String)e.nextElement();
        if (fileName.charAt(fileName.length()-1) == SEP)
        {
          browser.append(fileName,null);
        }
        else
        {
          browser.append(fileName,null);
        }
      }
      browser.setSelectCommand(view);
      browser.addCommand(exit);
      browser.setCommandListener(this);
      if (currDir != null)
      {
        currDir.close();
      }
      Display.getDisplay(this).setCurrent(browser);
    }
    catch (Exception ioe)
    {}
  }



/**
* effettua la navigazione tra le directory
*/


  void traverseDirectory(String fileName)
  {
    if (currDirName.equals(MEGA_ROOT))
    {
      if (fileName.equals(UP_DIRECTORY))
      {
        // can not go up from MEGA_ROOT
        return;
      }
      currDirName = fileName;
    }
    else if (fileName.equals(UP_DIRECTORY))
    {
      // Go up one directory
      // TODO use setFileConnection when implemented
      int i = currDirName.lastIndexOf(SEP, currDirName.length()-2);
      if (i != -1)
      {
        currDirName = currDirName.substring(0, i+1);
      }
      else
      {
        currDirName = MEGA_ROOT;
      }
    }
    else
    {
      currDirName = currDirName + fileName;
    }
    showCurrDir();
  }

Una volta che l'utente seleziona un file presente nel cellulare (secondo le directory ottenute in output - nel mio caso : sdcard/) viene richiamata la funzione di 'upload' del file da qui:

Codice (Java): [Seleziona]
/**
* Apre una connessione http con il server richiamando la servlet opportuna
* per comunicare il caricamento di un file video
@param pathfile il path del file
@param file il nome del file
*/


  private void upload(String pathfile,String file) {
    HttpConnection hc = null;
    InputStream in = null;
    OutputStream os = null;
    StringBuffer b = new StringBuffer();

    try {
          hc = (HttpConnection)Connector.open("http://www.sitoblabla.it/app/upload");

          hc.setRequestMethod(HttpConnection.GET);
          hc.setRequestProperty("IF-Modified-Since", "20 Jan 2001 16:19:14 GMT");
          hc.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.1");
          hc.setRequestProperty("Content-Language", "en-CA");
          os = hc.openOutputStream();

          os.write('2');
          os.write('§');

          byte postmsg4[] = usr.getBytes();
           for(int i=0;i<postmsg4.length;i++) {
            os.write(postmsg4[i]);
          }
          os.write('§');
          byte postmsg[] = tit.getBytes();
           for(int i=0;i<postmsg.length;i++) {
            os.write(postmsg[i]);
          }
          os.write('§');
          byte postmsg2[] = desc.getBytes();
           for(int i=0;i<postmsg2.length;i++) {
            os.write(postmsg2[i]);
          }
          os.write('§');
          byte postmsg3[] = keys.getBytes();
           for(int i=0;i<postmsg3.length;i++) {
            os.write(postmsg3[i]);
          }
          os.write('§');
          byte postmsg5[] = file.getBytes();
           for(int i=0;i<postmsg5.length;i++) {
            os.write(postmsg5[i]);
          }
          os.flush();
          os.close();
          hc.close();


   
            FileConnection fc = (FileConnection)Connector.open("file://localhost/"+pathfile);
            if (fc.exists()){
                long siz=fc.fileSize();
               
                    hc = (HttpConnection)Connector.open("http://www.sitoblabla.it/app/upload");
                    hc.setRequestMethod(HttpConnection.GET);
                    hc.setRequestProperty("IF-Modified-Since", "20 Jan 2001 16:19:14 GMT");
                    hc.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.1");
                    hc.setRequestProperty("Content-Language", "en-CA");
                    DataOutputStream dos = hc.openDataOutputStream();

                    dos.write('0');
                    dos.write('§');
                    dos.writeUTF( String.valueOf(siz) );
                    dos.flush();
                    dos.close();
                    hc.close();
                    DataInputStream dis=fc.openDataInputStream();

                if(siz<maxFileSize){
                    hc = (HttpConnection)Connector.open("http://www.sitoblabla.it/app/upload");
                    hc.setRequestMethod(HttpConnection.POST);
                    hc.setRequestProperty("IF-Modified-Since", "20 Jan 2001 16:19:14 GMT");
                    hc.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.1");
                    hc.setRequestProperty("Content-Language", "en-CA");

                    os = hc.openOutputStream();
                    int chr;
                    while ((chr = dis.read()) != -1){
                        os.write(chr);
                    }
                    os.flush();
                    os.close();
                    hc.close();
                }
                else{
                    long n=siz/maxFileSize;
                 
                    for(int i=0;i<n;i++){
                        int p=100*i/(int)n;
                        upMessageItem.setText( (new Integer(p)).toString()+"%");
                       
                        ByteArrayOutputStream bos=new ByteArrayOutputStream();
                        for(int j=0;j<maxFileSize;j++){
                            bos.write(dis.read());
                        }

                        hc = (HttpConnection)Connector.open("http://www.sitoblabla.it/app/upload");
                        hc.setRequestMethod(HttpConnection.POST);
                        hc.setRequestProperty("IF-Modified-Since", "20 Jan 2001 16:19:14 GMT");
                        hc.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.1");
                        hc.setRequestProperty("Content-Language", "en-CA");

                        os = hc.openOutputStream();
                        os.write(bos.toByteArray());
                        os.flush();
                        os.close();
                        bos.close();
                    }

                        hc = (HttpConnection)Connector.open("http://www.sitoblabla.it/app/upload");
                        hc.setRequestMethod(HttpConnection.POST);
                        hc.setRequestProperty("IF-Modified-Since", "20 Jan 2001 16:19:14 GMT");
                        hc.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.1");
                        hc.setRequestProperty("Content-Language", "en-CA");

                        os = hc.openOutputStream();

                    int chr;
                    while ((chr = dis.read()) != -1){
                        os.write(chr);
                    }
                   
                    os.flush();
                    os.close();
                    hc.close();
                }
                    hc = (HttpConnection)Connector.open("http://www.sitoblabla.it/app/upload");
                    hc.setRequestMethod(HttpConnection.GET);
                    hc.setRequestProperty("IF-Modified-Since", "20 Jan 2001 16:19:14 GMT");
                    hc.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.1");
                    hc.setRequestProperty("Content-Language", "en-CA");
                    os = hc.openOutputStream();

                    os.write('1');
                    os.write('§');
                    os.flush();
                    os.close();

                    in = hc.openInputStream();
                    int contentLength = (int)hc.getLength();
                    byte[] raw = new byte[contentLength];
                    int length = in.read(raw);
                    in.close();
                    hc.close();

                    dis.close();
                    fc.close();

                    mMessageItem3.setText(new String(raw, 0, length));
            }
            else{
                    mMessageItem3.setText("file not found");
                   
            }

      mDisplay.setCurrent(frm3);

    }
    catch (Exception ioe) {
      mMessageItem3.setText(ioe.toString());
      mDisplay.setCurrent(frm3);
    }
  }


La navigazione tra le directory funziona, è al momento della conferma dell'upload del file selezionato che visualizzo dopo circa 5 secondi il messaggio: no data on stream.

Spero di essere stata + chiara e in un vostro aiuto.

grazie ancora  ;-)

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:FileConnection API
« Risposta #3 il: 07 Luglio 2011, 16:48:40 CEST »
0
una chiamata in GET non credo abbia un output stream per fare l'upload... dovresti usare la POST
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:FileConnection API
« Risposta #4 il: 07 Luglio 2011, 17:54:30 CEST »
0
Mmh...perchè una richiesta GET non dovrebbe avere un OutputStream ? E' pur sempre una richiesta al server  :-P. La differenza tra GET e POST è la mole di dati che si possono inviare, infatti la parte di codice relativa all'upload dei file dovrebbe essere questa :

Codice (Java): [Seleziona]
if(siz<maxFileSize){
                    hc = (HttpConnection)Connector.open("http://www.sitoblabla.it/app/upload");
                    hc.setRequestMethod(HttpConnection.POST);
                    hc.setRequestProperty("IF-Modified-Since", "20 Jan 2001 16:19:14 GMT");
                    hc.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.1");
                    hc.setRequestProperty("Content-Language", "en-CA");

                    os = hc.openOutputStream();
                    int chr;
                    while ((chr = dis.read()) != -1){
                        os.write(chr);
                    }
                    os.flush();
                    os.close();
                    hc.close();
                }
...

Dove infatti viene fatta una richiesta attraverso il metodo POST. (ma posso anche sbagliarmi...) :-P

Comunque, immagino che il codice funzioni su altri dispositivi (Symbian & Co.), dato trattasi di porting suppongo. Risulta comunque difficile fare il debug, dato che viene catturata una Exception generica, potresti in prima battuta diversificare i catch (anche se il problema è comunque su uno stream) e fare il print di tutto lo stack trace in modo da avere più info dell'Exception generata...magari sotto logcat :-P

Tieni presente oltretutto che Android è più potente di j2me, valutando anche la possibilità di riscrivere il codice dell'app direttamente sotto framework Android.Ma questa è solo una mia opinione.

Offline Ale83

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG OPTIMUS ONE, v. Android 2.2.1 Froyo
  • Sistema operativo:
    Windows XP - SP2
Re:FileConnection API
« Risposta #5 il: 08 Luglio 2011, 12:30:41 CEST »
0
Per Nicola_D :   ho provato a sostituire GET con POST ma ora solleva la seguente eccezione:

java.lang.StringIndexOutOfBoundsException     comunque ancora grazie per l'aiuto  ;-) siete molto gentili

Per Teskio:  Si la porzione di codice relativa all'upload è proprio quella, la mia applicazione è nata per girare su symbian (e così com'è l'upload funziona), avendo la necessità di ampliarla anche su altri cellulari ho pensato di convertirla in app Android con http://netmite.com/android/srv/2.0/getapk.php. Una volta installato il file .apk procedo con l'autenticazione dell'utente sul server (tramite una servlet opportuna è funziona), i problemi sorgono soltanto quando confermo il file selezionato da caricare sul server (tramite la servlet opportuna "upload").

Sì anch'io penso che android sia + potente di javame, ma con tutta sincerità volevo evitare di ripetere l'intera applicazione sotto framework android  :-P visto che esistono dei siti in grado di effettuare un porting  :-P

Per questo volevo cercare di risolvere il problema mantenendomi su javame. 

Eppure penso che Android non riconosca la FileConnection API di javame, forse non è presente? vi ringrazio ancora !

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:FileConnection API
« Risposta #6 il: 08 Luglio 2011, 12:43:53 CEST »
0
Eppure penso che Android non riconosca la FileConnection API di javame, forse non è presente? vi ringrazio ancora !

Se non ci fosse penso che ti beccheresti un'eccezione diversa, tipo una VerifyClassException.
Comunque io proverei a cambiare le api utilizzate, prova a fare un occhio a questo tutorial, dove viene spiegato come fare un File Browser: 

anddev.org &bull; View topic - Building an Android FileBrowser (list-based) !

e dove viene usata solo la classe File.

PS: Io nei convertitori di codice non ho molta stima, che siano comodi questo è un dato di fatto, ma non bisogna fidarsi ciecamente di quello che fanno.