2011-09-15 13 views
12

ho scritto un file attraverso il mio programma di Android in questo modo:Impossibile visualizzare un file in Windows scritto da un app Android su SD-card a meno che "Forza Chiudi" l'applicazione

String file = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Files/hello.txt"; 
BufferedWriter writer = new BufferedWriter(new FileWriter(file)); 
writer.write(str+"\n");  \\yeah str has a value there 
writer.close(); 

Il programma fa il suo lavoro e finisce. Ora premo il pulsante Indietro su Android per chiudere l'applicazione. Quello che succede ora, è che se vado in un browser di file Android (come Astro) posso vedere il file, ma se monto la scheda SD su Windows, non riesco a vedere il file!

Ora, se vado a Settings > Applications > Manage Applications > "Force Stop" <application> sono in grado di vedere il file anche in Windows.

Cosa devo fare in modo che possa vedere un file in Windows se il file è stato scritto dalla mia app Android su sd-card e non voglio andare alle impostazioni e premere forza chiudi ogni volta.

In realtà il file è stato scritto correttamente (credo) ma poiché il comportamento predefinito del pulsante "Indietro" di Android non uccide l'app, e sembra che a meno che l'app non venga uccisa Non riesco ad aprire il file all'esterno Android (in Android, sono ancora in grado di vederlo e persino di aprirlo).

Quindi, quale sarebbe la soluzione migliore per questo caso. Devo uccidere automaticamente l'app quando si sta chiudendo? La gente dice che System.exit() è severamente sconsigliato.

+0

Ho lo stesso identico problema. Sei riuscito a risolverlo da quando hai fatto la tua domanda? – BVB

risposta

0

Poiché un oggetto BufferedWriter è un buffer , è necessario eseguire il flush() del buffer per forzare il contenuto da scrivere nel flusso di output.

String file = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Files/hello.txt"; 
BufferedWriter writer = new BufferedWriter(new FileWriter(file)); 
writer.write(str+"\n"); 
writer.flush(); // force the buffer to actually dump its data to the stream 
writer.close(); 

Quando si .WRITE() utilizzando un buffer, ricordate sempre che i dati saranno conservati nel buffer fino a quando il buffer è pieno (e quindi automagicamente flush() ed) o ti costringono il buffer per irrigare i suoi dati usando il metodo .flush() del buffer.

Inoltre, il motivo per cui il file non è stato scritto correttamente finché non si chiude forzatamente l'applicazione è perché quando si uccide un'applicazione, uno dei passaggi è quello di svuotare() tutti i buffer associati all'applicazione. Ecco perché questo accadeva solo quando lo hai ucciso con la forza.

Nota: Tenere presente che questo è il comportamento predefinito della maggior parte dei flussi bufferizzati in molte lingue diverse.

+0

'.close()' chiama automaticamente '.flush()' – Tyrmos

21

È necessario utilizzare il seguente codice in modo che l'archivio venga visualizzato nel file system di Windows o nella galleria del telefono.

avete due possibilità:

  1. E'più veloce perché gli aggiornamenti Android solo il file passato:

    MediaScannerConnection.scanFile(this, new String[]{"your path here</"}, null, null);

  2. E'più costoso perché Android cercherà tutti i file nel percorso passato. È possibile passare solo il percorso della cartella per ridurre la ricerca dei file:

    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri .parse("file://" +"path of the folder")));

+0

Questo dovrebbe essere davvero votato di più - buona soluzione probabilmente a un problema comune. –

+0

Grazie. Spero che questa soluzione aiuti molti sviluppatori. – thiagolsilva

+1

Sfortunatamente il modo sendBroadcast non funziona più a partire da Kitkat Android 4.4. :( –

0

Windows 7 ha avuto problemi che vedono file durante la connessione tramite USB. La soluzione per me stava usando una distro GNU/Linux.

Utilizzando un'app per i termini, esiste una differenza in cui i file root: root sono visualizzabili su Explorer, ma nessun altro proprietario.

+0

Potresti spiegare meglio il concorso della tua soluzione? – abarisone

Problemi correlati