Autore Topic: Costruttore FTPClient  (Letto 660 volte)

Offline dimandrea

  • Nuovo arrivato
  • *
  • Post: 39
  • In realtà detesto con tutto me stesso Android.
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus MemoPad HD 7
  • Sistema operativo:
    Windows 7 - Windows 8.1 Up 1
Costruttore FTPClient
« il: 04 Giugno 2014, 17:53:57 CEST »
0
Problema: il costruttore "FTPClient client = new FTPClient();" la mia applicazione va in crash. Ma solo ora, fino a ieri pomeriggio funzionava, persino sul mio vecchio HTC Wildfire.

Ho importato le librerie di apache per l'ftp, ho messo tutto in try e catch ma non c'è verso, non funziona.
Credo di aver creato un casino nel manifest; ve lo posto

Citazione
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="it.xxxxx.mybarcodescanner"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/icon"
        android:label="xxxxx" >
        <activity
            android:name="it.xxxxx.mybarcodescanner.MyBarcodeScannerActivity"
            android:label="xxxxx - Lettore codice a barre"
            android:screenOrientation="portrait" >
           
        </activity>
        <activity
            android:name="it.xxxxx.mybarcodescanner.LoginActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
  <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" />

    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="19"
    />
</manifest>

Grazie
« Ultima modifica: 04 Giugno 2014, 18:00:29 CEST da dimandrea »
Stupido è chi lo stupido fa!

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:Costruttore FTPClient
« Risposta #1 il: 04 Giugno 2014, 20:02:13 CEST »
0
e il logcat?
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 dimandrea

  • Nuovo arrivato
  • *
  • Post: 39
  • In realtà detesto con tutto me stesso Android.
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus MemoPad HD 7
  • Sistema operativo:
    Windows 7 - Windows 8.1 Up 1
Re:Costruttore FTPClient
« Risposta #2 il: 05 Giugno 2014, 15:26:49 CEST »
0
Il logcat a questo indirizzo: https://drive.google.com/file/d/0B_VVPxpS97eUcE00cU5zNTZhZ28/edit?usp=sharing

Ecco la porzione di codice dove si verifica l'errore
Codice (Java): [Seleziona]
 // Invio file via FTP
                                        TextView risposta = (TextView) findViewById(R.id.RispostaServer);
                                        FTPClient client = new FTPClient();
                                InetAddress indirizzo = InetAddress.getByName("192.168.5.90");
                                client.setDefaultPort(14147);
                                client.enterLocalPassiveMode();
                                client.connect(indirizzo);
                                risposta.setText(client.getReplyString());
                                //aperta la connessione al server procedo al login
                                boolean loggato=client.login("xxxxx", "xxxxx");
                                if(loggato==true) risposta.append(" ....login effettuato");
                                else risposta.append("...login fallito");
                                client.setFileType(FTP.LOCAL_FILE_TYPE);
                                File file = new File(path,fnome);
                                FileInputStream fis = new FileInputStream(file);
                            risposta.append("...path file: " + file.getPath());
                                boolean upload_ok=client.storeFile(fnome, fis);
                                fis.close();
                                if(upload_ok==true)risposta.append("  ..... upload ok");
                                else risposta.append("....upload fallito, errore: " + upload_ok);
                                Button btn = (Button)findViewById(R.id.btnInvio);
                                    btn.setVisibility(View.INVISIBLE);
                                    scan.setText("Avvia scansione");
                                    TextView scanText = (TextView)findViewById(R.id.scanResult);
                                    scanText.setText(String.format(" "));
                                // Fine invio
« Ultima modifica: 05 Giugno 2014, 15:29:19 CEST da dimandrea »
Stupido è chi lo stupido fa!

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:Costruttore FTPClient
« Risposta #3 il: 05 Giugno 2014, 16:34:44 CEST »
0
il logcat è molto chiaro: "NetworkOnMainThreadException"
Stai facendo chiamate di rete sul thread della UI. Non va bene, devi usare un service,un thread, un asynctask o altro per gestire le chiamate di rete!
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 dimandrea

  • Nuovo arrivato
  • *
  • Post: 39
  • In realtà detesto con tutto me stesso Android.
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus MemoPad HD 7
  • Sistema operativo:
    Windows 7 - Windows 8.1 Up 1
Re:Costruttore FTPClient
« Risposta #4 il: 05 Giugno 2014, 16:41:35 CEST »
0
Il punto è che fino a ieri l'altro funzionava tutto alla perfezione e i file li inviava correttamente sul server FTP (che per ora lo simulo sul mio PC).

Cmq come realizzo questi service, thread ecc che mi consigli?
Stupido è chi lo stupido fa!

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:Costruttore FTPClient
« Risposta #5 il: 05 Giugno 2014, 16:48:06 CEST »
0
Cmq come realizzo questi service, thread ecc che mi consigli?

L'argomento che devi studiare è quello degli AsyncTask. Ci sono tanti tutorial e guide in giro.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline dimandrea

  • Nuovo arrivato
  • *
  • Post: 39
  • In realtà detesto con tutto me stesso Android.
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus MemoPad HD 7
  • Sistema operativo:
    Windows 7 - Windows 8.1 Up 1
Re:Costruttore FTPClient
« Risposta #6 il: 05 Giugno 2014, 16:49:07 CEST »
0
grazie. a presto
Stupido è chi lo stupido fa!

Offline dimandrea

  • Nuovo arrivato
  • *
  • Post: 39
  • In realtà detesto con tutto me stesso Android.
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus MemoPad HD 7
  • Sistema operativo:
    Windows 7 - Windows 8.1 Up 1
Re:Costruttore FTPClient
« Risposta #7 il: 10 Giugno 2014, 18:44:56 CEST »
0
Problema: ho seguito i vostri consigli ed ho usato l'Asynctask per effettuare l'invio del file; mi da errore nella seguente porzione di codice
Codice (Java): [Seleziona]
InvioAsync Invio = new InvioAsync();
                                                Invio.execute(fnome,fis);

ed ecco l'intera classe
Codice (Java): [Seleziona]
package it.xxxxx.mybarcodescanner;

import java.io.*;
import java.net.InetAddress;
import java.util.Calendar;

import org.apache.commons.net.ftp.*;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

@TargetApi(Build.VERSION_CODES.FROYO) public class MyBarcodeScannerActivity extends Activity {
        private static final Intent SCAN_INTENT = new Intent("com.google.zxing.client.android.SCAN");
        public abstract class InvioAsync extends AsyncTask <File, InputStream, Void> {

                public InvioAsync(){}
               
                 protected Void doInBackground(String a, InputStream b){
                         FTPClient mFTP = new FTPClient();
                         try {
                     // Connect to FTP Server
                                        FTPClient client = new FTPClient();
                                        InetAddress indirizzo = InetAddress.getByName("192.168.5.90");
                                        client.setDefaultPort(14147);
                                        client.enterLocalPassiveMode();
                                        client.connect(indirizzo);
                                        client.login("xxxx", "xxxxxx");
                                        Log.i("connessione","connesso");
                                        boolean upload_ok=mFTP.storeFile(a,b);
                                        if (upload_ok==true) Log.i("Caricamento", "ok");
                         }
                         catch (Exception e) {
                            e.printStackTrace();
                        }
                        return null;
                 }
                 protected void onPostExecute(Long result) {
                 Log.i("Operazione","Conclusa");
             }
        }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        PackageManager packageManager = this.getPackageManager();
        ResolveInfo resolveInfo = packageManager.resolveActivity(SCAN_INTENT, PackageManager.GET_RESOLVED_FILTER);
        Button btn = (Button)findViewById(R.id.btnInvio);
        Button scan = (Button)findViewById(R.id.scanButton);
        btn.setVisibility(View.INVISIBLE);
        if(resolveInfo==null) {
                scan.setEnabled(false);
                ((TextView)this.findViewById(R.id.scanResult)).setText("Attenzione. Sul dispositivo non e' presente la libreria per leggere il codice a barre.\nScaricala qui: http://www.appbrain.com/app/com.google.zxing.client.android");
        }
    }
   
        public void onScan(View view) {
                startActivityForResult(SCAN_INTENT, 0);
        }

        protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                Button btn = (Button)findViewById(R.id.btnInvio);
                if (resultCode == Activity.RESULT_OK && requestCode == 0) {   // Result OK
                        final String scanResult = data.getStringExtra("SCAN_RESULT");
                        ((TextView)this.findViewById(R.id.scanResult)).setText(String.format("Codice scansionato: %1$s", scanResult));                 
                        btn.setVisibility(View.VISIBLE);
                        final Button scan = (Button)findViewById(R.id.scanButton);
                        scan.setText("Esegui nuovamente la scansione");
                        btn.setOnClickListener(new View.OnClickListener() {
                               
                                @SuppressWarnings({ "unchecked", "rawtypes" })
                                @Override
                                public void onClick(View v) {
                                        //creazione e scrittura file
                                        final File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
                                        // Nome del file nel formato YYYYMMDDhhmmssnnn - NO ESTENSIONE
                                        Calendar adesso = Calendar.getInstance();
                                        int anno = adesso.get(Calendar.YEAR);                           // ANNO CORRENTE INT
                                        String annos = Integer.toString(anno);                          // ANNO CORRENTE STRING
                                        int mese = adesso.get(Calendar.MONTH);                          // MESE CORRENTE INT
                                        String meses = Integer.toString(mese);                          // MESE CORRENTE STRING
                                        int giorno = adesso.get(Calendar.DAY_OF_MONTH);         // GIORNO CORRENTE INT
                                        String giornos = Integer.toString(giorno);                      // GIORNO CORRENTE STRING
                                        int ora = adesso.get(Calendar.HOUR_OF_DAY);                     // ORA CORRENTE INT
                                        String oras = Integer.toString(ora);                            // ORA CORRENTE STRING
                                        int minuti = adesso.get(Calendar.MINUTE);                       // MINUTI CORRENTI INT
                                        String minutis = Integer.toString(minuti);                      // MINUTI CORRENTI STRING
                                        int secondi = adesso.get(Calendar.SECOND);                      // SECONDI CORRENTI INT
                                        String secondis = Integer.toString(secondi);            // SECONDI CORRENTI STRING
                                        int milli = adesso.get(Calendar.MILLISECOND);           // MILLISECONDI CORRENTI INT
                                        String millis = Integer.toString(milli);                        // MILLISENCODI CORRENTI STRING
                                        final String fnome;
                                        int lungm = meses.length();                                                     // LUNGHEZZA CARATTERI MESE
                                        int lungg = giornos.length();                                           // LUNGHEZZA CARATTERI GIORNO
                                        int lungo = oras.length();                                                      // LUNGHEZZA CARATTERI ORA
                                        int lungmn = minutis.length();                                          // LUNGHEZZA CARATTERI MINUTI
                                        int lungs = secondis.length();                                          // LUNGHEZZA CARATTERI SECONDI
                                        int lungmi = millis.length();                                           // LUNGHEZZA CARATTERI MILLISECONDI
                                        if (lungm == 1) {                                                                       // SE NUMERO CARATTERI MESE = 1 AGGIUNGI UNO ZERO DAVANTI
                                                meses = "0"+meses;
                                        }
                                        if (lungg == 1) {                                                                       // SE NUMERO CARATTERI GIORNO = 1 AGGIUNGI UNO ZERO DAVANTI
                                                giornos = "0"+giornos;
                                        }                                      
                                        if (lungo == 1) {                                                                       // SE NUMERO CARATTERI ORA = 1 AGGIUNGI UNO ZERO DAVANTI
                                                oras = "0"+oras;
                                        }
                                        if (lungmn == 1) {                                                                      // SE NUMERO CARATTERI MINUTI = 1 AGGIUNGI UNO ZERO DAVANTI
                                                minutis = "0"+minutis;
                                        }
                                        if (lungs == 1) {                                                                       // SE NUMERO CARATTERI SECONDI = 1 AGGIUNGI UNO ZERO DAVANTI
                                                secondis = "0"+secondis;
                                        }
                                        if (lungmi == 1) {                                                                      // SE NUMERO CARATTERI MILLISECONDI = 1 AGGIUNGI DUE ZERO DAVANTI
                                                millis = "00"+millis;
                                        } else if (lungmi == 2) {                                                       // SE NUMERO CARATTERI MILLISECONDI = 2 AGGIUNGI UNO ZERO DAVANTI
                                                millis = "0"+millis;
                                        }
                                        fnome = annos+meses+giornos+oras+minutis+secondis+millis;       // NOME COMPLETO - FORMATO YYYYMMDDhhmmssnnn
                                        // fine creazione nome
                                         try            // Scrittura file su memoria
                                                {
                                                 File prova = new File(path, fnome);
                                                 OutputStream os = new FileOutputStream(prova);
                                                 os.write(scanResult.getBytes());
                                                 os.write("\n".getBytes());
                                                 os.write(fnome.getBytes());
                                                 os.close();
                                                 Toast.makeText(getBaseContext(), "Scrittura avvenuta con successo",Toast.LENGTH_LONG).show();  
                                                 File file = new File(path,fnome);
                                                 FileInputStream fis = new FileInputStream(file);
                                                 // Fine scrittura file
                                                                         
                                                 // Invio file via FTP
                                                InvioAsync Invio = new InvioAsync();
                                                Invio.execute(fnome,fis);
                                                }                                       // Fine Try -- Scrittura su memoria
                                         catch (IOException e)
                                                {
                                                        e.printStackTrace();
                                                }
                                }                                                               // Fine public void onClick
                        });                                                                     // Fine OnClickListener
                }                                                                               // Fine If -- Result OK
        }                                                                                       // Fine protected void onActivityResult
       
       
}                                                                                               // Fine MyBarcodeScanner.Class

Mi sono consultato con colleghi, con forum, guide e tutto il consultabile: gli asynctask posso dichiararli nella stessa classe in cui viene richiamato.
Grazie
Stupido è chi lo stupido fa!

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:Costruttore FTPClient
« Risposta #8 il: 10 Giugno 2014, 19:04:20 CEST »
0
Una prima cosa che secondo me non va bene è il fatto che tu crei l'oggetto InvioAsync dentro il listener (dove poi lanci l'esecuzione), però poi tu esci dal listener e lo perdi.

Metti "InvioAsync Invio" come variabile dell'activity, e togli la dichiarazione della variabile dal listener, lasciando solo "Invio = new InvioAsync();"

Se poi ci sono errori in esecuzione, posta il LogCat dell'errore.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline dimandrea

  • Nuovo arrivato
  • *
  • Post: 39
  • In realtà detesto con tutto me stesso Android.
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus MemoPad HD 7
  • Sistema operativo:
    Windows 7 - Windows 8.1 Up 1
Re:Costruttore FTPClient
« Risposta #9 il: 12 Giugno 2014, 18:03:02 CEST »
0
Risolto... grazie del consiglio sugli AsyncTask.

Stupido è chi lo stupido fa!