Autore Topic: Salvataggio File da Url a una Directory  (Letto 749 volte)

Offline Ayeye

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Salvataggio File da Url a una Directory
« il: 29 Aprile 2013, 17:29:06 CEST »
0
Ciao a tutti!
Sto facendo un'app per la quale prima di eseguire il parsing di un file xml bisogna che me lo salvi in locale.

Vorrei sapere se mi riuscire a consigliare un modo per salvare in una cartella, che creo con l'istruzione:
Codice (XML): [Seleziona]
File dir1 = getDir("xmls",Context.MODE_PRIVATE);
un file xml partendo dal suo indirizzo url.

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Salvataggio File da Url a una Directory
« Risposta #1 il: 29 Aprile 2013, 18:37:55 CEST »
0
Il problema é scaricare un file? Se cerchi su internet é pieno di esempi Let me google that for you
Postate il LogCat LogCat LogCat LogCat LogCat

Offline Ayeye

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Re:Salvataggio File da Url a una Directory
« Risposta #2 il: 30 Aprile 2013, 09:34:27 CEST »
0
Avevo provato alcuni tutorial trovati su google il problema e che non mi funzionavano... :'(

Ora ho provato questo: Scaricare un file da un URL | Fondamenti Java | Pagetitle
però non finisce lo scaricamento e nel logcat è presente ciò:

Codice (Java): [Seleziona]
04-30 07:26:53.701: I/System.out(445): Downloading ...
04-30 07:26:53.900: W/System.err(445): java.io.FileNotFoundException: /news.xml (Read-only file system)
04-30 07:26:54.204: I/ActivityManager(61): Displayed com.example.savexml/.MainActivity: +1s362ms
04-30 07:26:59.280: D/dalvikvm(126): GC_EXPLICIT freed 87K, 48% free 3097K/5895K, external 2304K/2675K, paused 51ms
04-30 07:27:05.130: D/dalvikvm(193): GC_EXPLICIT freed 55K, 50% free 2989K/5895K, external 716K/1038K, paused 50ms
04-30 07:27:09.706: D/SntpClient(61): request time failed: java.net.SocketException: Address family not supported by protocol
04-30 07:27:10.180: D/dalvikvm(256): GC_EXPLICIT freed 6K, 51% free 2711K/5511K, external 716K/1038K, paused 64ms
04-30 07:27:15.229: D/dalvikvm(266): GC_EXPLICIT freed 12K, 52% free 2762K/5703K, external 716K/1038K, paused 67ms
04-30 07:27:20.280: D/dalvikvm(313): GC_EXPLICIT freed 11K, 44% free 3349K/5959K, external 716K/1038K, paused 71ms
04-30 07:27:25.340: D/dalvikvm(349): GC_EXPLICIT freed 8K, 44% free 3510K/6215K, external 716K/1038K, paused 73ms
04-30 07:27:30.390: D/dalvikvm(364): GC_EXPLICIT freed 3K, 51% free 2704K/5511K, external 716K/1038K, paused 62ms

Non riesco a capire a cosa si riferiscano tutti quei GC_EXPLICIT  o_O


La mia activity è:

Codice (Java): [Seleziona]
public class MainActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
               
                File dir1 = getDir("xmls",Context.MODE_PRIVATE);//Creating an internal dir;
               
               
                try {
                            URL url = new URL("l'url del xml");
               
                            // The server thinks this request is from an Opera browser!
                            String userAgent = "Opera/9.63 (Windows NT 5.1; U; en) Presto/2.1.1";
               
                            System.out.println("Downloading ...");
               
                            downloadFromUrl(url, "news.xml", userAgent);
               
                            System.out.println("OK");
                        }
                catch (Exception e)
                        {
                                System.err.println(e);
                        }
                               
               
        }
       
        public static void downloadFromUrl(URL url, String localFilename, String userAgent)
            throws IOException {
                InputStream is = null;
                FileOutputStream fos = null;
       
                try {
                    URLConnection urlConn = url.openConnection();
       
                    if (userAgent != null) {
                        urlConn.setRequestProperty("User-Agent", userAgent);
                    }
       
                    is = urlConn.getInputStream();
                    fos = new FileOutputStream(localFilename);
       
                    byte[] buffer = new byte[4096];
                    int len;
       
                    while ((len = is.read(buffer)) > 0) {
                        fos.write(buffer, 0, len);
                    }
                } finally {
                    try {
                        if (is != null) {
                            is.close();
                        }
                    } finally {
                        if (fos != null) {
                            fos.close();
                        }
                    }
                }
            }

E nel manifest ho dato i seguenti permessi:
Codice (Java): [Seleziona]
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>


Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Salvataggio File da Url a una Directory
« Risposta #3 il: 30 Aprile 2013, 10:21:00 CEST »
+2
Il problema è qui
Codice (Java): [Seleziona]
fos = new FileOutputStream(localFilename);poichè tu richiami il metodo con
Codice (Java): [Seleziona]
 downloadFromUrl(url, "news.xml", userAgent);Tu non stai utilizzando questa variabile.
Codice (Java): [Seleziona]
File dir1 = getDir("xmls",Context.MODE_PRIVATE);//Creating an internal dir;
Cosi facendo stai tentando di scrivere su una cartella che di default è readonly.
Tu puoi scrivere nell'internalStorage o nell'externalStorage (che non necessariamente significa card SD).
Sarebbe meglio usare qualcosa come:
Codice (Java): [Seleziona]
new File(getFilesDir() + File.separator + fileName)
Ti consiglio di dare una occhiata a questi metodi. Dipende a cosa ti serve salvare il file.
getDir() -- restituisce la directory sotto /data/data/yourapname/
getFilesDir() -- restituisce la directory sotto /data/data/yourappname/files/
fileList() -- restituisce la lista di file in /data/data/yourappname/files/
getFileStreamPath() -- Prende un file in /data/data/yourappname/files/
openFileInput() -- Apre un file in lettura in /data/data/yourappname/files/
openFileOutput() -- Apre un file in scrittura in /data/data/yourappname/files/
getCacheDir() -- Restituisce la directory /data/data/yourappname/cache/
getExternalCacheDir() -- restituisce la directory /sdcard/Android/data/yourappname/cache/


Dai una occhiata alla documentazione :
http://developer.android.com/guide/topics/data/data-storage.html


Offline Ayeye

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Re:Salvataggio File da Url a una Directory
« Risposta #4 il: 30 Aprile 2013, 10:36:14 CEST »
0
Grazie! :-)
Cambiando la path della cartella ora gira e completa le istuzioni,
però nel logcat continuano ad apparire questi avvisi:

Codice (Java): [Seleziona]
04-30 08:33:47.227: I/System.out(432): Downloading ...
04-30 08:33:48.617: I/System.out(432): OK
04-30 08:33:48.797: I/ActivityManager(60): Displayed com.example.savexml/.MainActivity: +2s284ms
04-30 08:33:53.927: D/dalvikvm(152): GC_EXPLICIT freed 115K, 48% free 3124K/5959K, external 2304K/2658K, paused 53ms
04-30 08:33:58.986: D/dalvikvm(204): GC_EXPLICIT freed 332K, 51% free 2938K/5895K, external 720K/1038K, paused 77ms
04-30 08:34:05.107: D/dalvikvm(244): GC_EXPLICIT freed 8K, 51% free 2711K/5511K, external 716K/1038K, paused 45ms
04-30 08:34:10.167: D/dalvikvm(269): GC_EXPLICIT freed 501K, 52% free 2766K/5703K, external 716K/1038K, paused 73ms
04-30 08:34:15.227: D/dalvikvm(314): GC_EXPLICIT freed 105K, 44% free 3353K/5959K, external 716K/1038K, paused 73ms
04-30 08:34:20.217: D/dalvikvm(348): GC_EXPLICIT freed 62K, 44% free 3511K/6215K, external 716K/1038K, paused 54ms
04-30 08:34:25.257: D/dalvikvm(363): GC_EXPLICIT freed 325K, 51% free 2706K/5511K, external 716K/1038K, paused 71ms

che cosa significano tutti quei GC_EXPLICIT ?
che non ho abbastanza spazio in memoria?

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Salvataggio File da Url a una Directory
« Risposta #5 il: 30 Aprile 2013, 11:43:03 CEST »
0
Grazie! :-)
Cambiando la path della cartella ora gira e completa le istuzioni,
però nel logcat continuano ad apparire questi avvisi:

Codice (Java): [Seleziona]
04-30 08:33:47.227: I/System.out(432): Downloading ...
04-30 08:33:48.617: I/System.out(432): OK
04-30 08:33:48.797: I/ActivityManager(60): Displayed com.example.savexml/.MainActivity: +2s284ms
04-30 08:33:53.927: D/dalvikvm(152): GC_EXPLICIT freed 115K, 48% free 3124K/5959K, external 2304K/2658K, paused 53ms
04-30 08:33:58.986: D/dalvikvm(204): GC_EXPLICIT freed 332K, 51% free 2938K/5895K, external 720K/1038K, paused 77ms
04-30 08:34:05.107: D/dalvikvm(244): GC_EXPLICIT freed 8K, 51% free 2711K/5511K, external 716K/1038K, paused 45ms
04-30 08:34:10.167: D/dalvikvm(269): GC_EXPLICIT freed 501K, 52% free 2766K/5703K, external 716K/1038K, paused 73ms
04-30 08:34:15.227: D/dalvikvm(314): GC_EXPLICIT freed 105K, 44% free 3353K/5959K, external 716K/1038K, paused 73ms
04-30 08:34:20.217: D/dalvikvm(348): GC_EXPLICIT freed 62K, 44% free 3511K/6215K, external 716K/1038K, paused 54ms
04-30 08:34:25.257: D/dalvikvm(363): GC_EXPLICIT freed 325K, 51% free 2706K/5511K, external 716K/1038K, paused 71ms

che cosa significano tutti quei GC_EXPLICIT ?
che non ho abbastanza spazio in memoria?

Nel logcat non ci sono solo informazioni relative alla tua applicazione, ma di tutte quelle attive.
Le istruzioni GC_EXPLICIT, GC_FOR_MALLOC..... sono relative alla jvm, in particolare al Garbage Collector.

Una cosa più importante invece.
Come codice va bene se è un esempio.
Ma in produzione , non lasciare una chiamata network e un parser nell'onCreate() perchè viene eseguito nel Thread principale, bloccando la videata.



Per chi volesse approfondire nel sorgente di dalvik/vm/alloc/Heap.h si trovano alcune informazioni
E inoltre c'è un bel video presentato al Google I/O 2011.
http://www.youtube.com/watch?v=_CruQY55HOk

Codice (Java): [Seleziona]
typedef enum {
       
    /* GC all heaps. */
    GC_FULL,
    /* GC just the first heap. */
    GC_PARTIAL
       
} GcMode;
       

typedef enum {

    /* Not enough space for an "ordinary" Object to be allocated. */
    GC_FOR_MALLOC,
   /* Automatic GC triggered by exceeding a heap occupancy threshold. */
    GC_CONCURRENT,
    /* Explicit GC via Runtime.gc(), VMRuntime.gc(), or SIGUSR1. */
    GC_EXPLICIT,
    /* GC to try to reduce heap footprint to allow more non-GC'ed memory. */
    GC_EXTERNAL_ALLOC,
    /* GC to dump heap contents to a file, only used under WITH_HPROF */
    GC_HPROF_DUMP_HEAP
} GcReason;