2011-01-20 6 views
9

Sto tentando di salvare alcuni dati dalla mia app in un semplice file di testo nell'area di archiviazione privata interna (preferenze utente dell'app). Ho letto molte domande qui (StackOverflow) e ho provato le soluzioni suggerite senza successo. La soluzione più semplice, a quanto pare, sarebbe quella suggerita qui:

http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

ma non riesco a farlo funzionare sul mio dispositivo di test. Ho anche provato a creare il file usando i metodi disponibili in java.io.File con i metodi appropriati. Ho anche provato a creare il file sulla SDCard con lo stesso risultato, fallire. Ho provato molte soluzioni elencate in altre risposte, seguendo il codice e le istruzioni suggerite esattamente e trovando lo stesso risultato. Sto cominciando a sentire che mi manca qualche importante pezzo di codice, o di una bandiera impostazione da qualche parte, ho impostare l'autorizzazione nel file manifesto:

Scrittura nella memoria privata interna in Android

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


Per essere chiari, Sto cercando di scrivere nella memoria privata interna del dispositivo. Si tratta di un file di piccole dimensioni contenente un nome, un numero di telefono e un paio di flag di tipo int. Che cosa mai metodo che uso, mi sia trovare che il file non ha creato (o modificare se metto il file manualmente sul SDCard), o ottengo un NullPointerException quando cerco di fare riferimento al file o il file location:

private    File fILE = new File("Mydata", main.FILENAME); 

o

private    File fILE = getDir("Mydata", 0); 


sono in esecuzione il codice su un HTC Hero, aggiornato con l'ultima release del servizio da Sprint. Qualsiasi aiuto sarebbe GRANDE apprezzato, grazie in anticipo!

-Steve

Update (2/2/11): Usando un'EVO (API 8) Ho ancora ottenere un NullPointerException. Di seguito è riportato il codice che genera l'eccezione, eventuali dubbi sul motivo per cui la mia app non può accedere alla memoria interna? Ho questo problema su tre diversi dispositivi fisici utilizzando due livelli API (API 7 e 8).

File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt"); 

UPDATE 2: 2/4/11 - Ho scoperto che non riesco a vedere la struttura dei file sul (directory dei dati) dispositivo fisico in qualsiasi circostanza. Qualcuno ha qualche idea su questo? Il dispositivo è configurato correttamente e può eseguire l'app da eclissi o adb.

UPDATE 3: (2/9/11) - Penso di aver trovato il problema, ma non sono sicuro di come gestirlo. Ho capito che le autorizzazioni sulla directory/data/sui dispositivi fisici sono: drwxrwx--x. Non sono sicuro del perché sia ​​così, forse qualcosa con Sprint? Ho trovato questo set in questo modo su un HTC Hero, Samsung Epic (Galaxy S) e HTC EVO tutti su Sprint. Il problema sembra essere che DDMS e la mia app non hanno accesso r/w alla directory. Ho bisogno di capire due cose qui, perché è così e come superare questo problema in natura. Ancora una volta, qualsiasi aiuto qui sarebbe FANTASTICO !!

AGGIORNAMENTO 4: Penso che lo scorso febbraio sia stato un momento totalmente biondo per me (vedi AGGIORNAMENTO 3). I dispositivi di test che ho non sono ROOTed e quindi nessun accesso (DUH!). Dopo tutti gli aggiornamenti effettuati da SGS e EVO 4G, il risultato è sempre lo stesso. Sto ancora lavorando a questo problema e proverò a tornare qui con un aggiornamento a breve (si spera meno di un anno la prossima volta).

+0

Si sta ricevendo un messaggio di errore quando si tentano questi metodi diversi o si sta semplicemente fallendo in modo silenzioso? –

+0

Attualmente mi sto concentrando sulla modalità 'openFileOutput()' e sto ricevendo una NullPointerException. Sembra che la directory privata dei dati sul telefono sia bloccata per qualche motivo, non riesco nemmeno a guardare la directory; è come se niente crea lì. Le autorizzazioni sulla directory "data" sul telefono sono: "drwxrwx - x".Sto iniziando a chiedermi se c'è un'impostazione non valida sul telefono o qualcosa del genere. È un requisito dell'app che il file di dati scrive nella memoria interna, per compatibilità. – Kingsolmn

+0

non sarà possibile accedere alla directory/data su un dispositivo fisico con DDMS a meno che non si disponga dell'accesso root ma si dovrebbe comunque essere in grado di scrivere su file dall'applicazione. cosa succede sull'emulatore? puoi scrivere un file ok? – techiServices

risposta

3

Non è una risposta diretta alla tua domanda, ma comunque: ho notato che non vuoi memorizzare tonnellate di dati nel tuo file. Sarebbe un'alternativa sufficiente per utilizzare invece le preferenze condivise?

E forse ancora più interessante: il problema si verifica anche quando si scrive invece nel file Preferenze condivise?

http://developer.android.com/guide/topics/data/data-storage.html#pref

+0

Non riesco a visualizzare/accedere in modo programmatico alla directory/data/su qualsiasi dispositivo fisico. Non ho eseguito la mia app su un dispositivo fisico da quando sono passato a SharedPreferences, ma so che non riesco ancora a visualizzare la directory. Sto usando Eclipse 3.5 classic, driver USB HTC, tutti aggiornati alla versione più recente. – Kingsolmn

+0

L'uso di 'SharedPreferences' funziona sul dispositivo fisico. Vedi la mia risposta qui sotto per le speculazioni oziose su ciò che è successo qui. @dbm – Kingsolmn

+0

Yeay! :-) Sembra che il tuo problema immediato sia risolto almeno. Sono contento di poterti aiutare (grazie per il segno di spunta verde) :-) – dbm

4

directory di un dispositivo fisico /data/ è disponibile solo all'utente root. Poiché l'unico modo realistico per ottenere questo accesso su un dispositivo fisico è il root del dispositivo, il file explorer di DDMS non può entrare in questo ramo dell'albero delle directory.

Sul motivo per cui l'app non scriverà lì, probabilmente il problema è nel fatto che ho firmato l'app con le chiavi di debug (non un grande esperto NIX, ma quello che sembra essere il caso qui dalla mia ricerca personale).

4

provare a cambiare la seguente riga:

File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt"); 

a:

File newfile = new File(this.getFilesDir() + "/","sample.txt"); 
+0

Non c'è bisogno di '+"/"'. –

4

avevo a che fare con lo stesso problema. Infine, ho scoperto che in realtà non devi dare tutto il percorso del file per creare un nuovo file nella memoria interna. Basta menzionare il nome del file e verrà creato nella cartella del pacchetto dell'app sul dispositivo. Ho fatto esattamente menzionato here

E funziona perfettamente. Direi di non menzionare il percorso completo del file come:/data/... per creare un file (hai bisogno delle giuste autorizzazioni per creare un file in questo modo). Lascia che Android framework faccia il lavoro per creare un file privato per la tua app.

2

L'area di archiviazione interna è una sorta di privato dell'applicazione, pertanto l'utente deve disporre dell'accesso root (dispositivo rooted) per creare e caricare i file. Se il dispositivo si è radicato questo è come scrivere un file nella memoria interna:

// Create a file in the Internal Storage 

String fileName = "MyFile"; 
String content = "hello world"; 

FileOutputStream outputStream = null; 
try { 
outputStream = openFileOutput(fileName, Context.MODE_APPEND); 
outputStream.write(content.getBytes()); 
outputStream.close(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Questo dovrebbe creare istantaneamente un file chiamato MyFile con il contenuto ciao mondo. La directory di archiviazione interna si trova di solito in una posizione speciale specificata dal nome del pacchetto della nostra app. Nel mio caso è/data/data/[nome pacchetto] ei file creati sono memorizzati in una directory chiamata file in quella directory.

0

Come dice @bianca, è meglio non utilizzare un percorso file. Ma invece, usa solo il nome del file per creare un file. Qualcosa di simile a questo:

public static void saveTextToFile(Context context, String filename, String content) { 
    try { 
    FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE); 
    fos.write(content.getBytes()); 
    fos.close(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 

E per ottenere il file, è possibile utilizzare:

File file = new File(context.getFilesDir(), filename); 

Per saperne di più: Saving Files.