Autore Topic: Percorso file in android  (Letto 890 volte)

Offline basicdany

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei p9
  • Sistema operativo:
    windows 7
Percorso file in android
« il: 05 Settembre 2017, 07:36:55 CEST »
0
Salve, ho realizzato procedura per leggere file xml ma mi da un errore che non trova il file, qualcuno mi può dare una mano??

public void Leggixml2()
{
    try
{
        DocumentBuilderFactory strumentiDati = DocumentBuilderFactory.newInstance();

        DocumentBuilder manipoloDati = strumentiDati.newDocumentBuilder();

        Document doc = manipoloDati.parse(getAssets().open("note.xml"));

        //definisco un arraylist
final ArrayList<String> data=new ArrayList<String>();
        final ArrayList<String> nome=new ArrayList<String>();
        final ArrayList<String> territorio=new ArrayList<String>();
        final ArrayList<String> sesso=new ArrayList<String>();
        final ArrayList<String> appunti=new ArrayList<String>();
        final ArrayList<String> prossimavisita=new ArrayList<String>();


        doc.getDocumentElement().normalize();
        //nodo principale :
NodeList nodi = doc.getElementsByTagName("<listanote>");

        for (int i = 0; i < nodi.getLength(); i++)
        {
            Node nodoItem = nodi.item(i);
            if (nodoItem.getNodeType() == Node.ELEMENT_NODE)
            {
                Element elemento = (Element) nodoItem;
                //campo data ecc ecc...
data.add(elemento.getElementsByTagName("data").item(0).getTextContent());
                nome.add(elemento.getElementsByTagName("nome").item(0).getTextContent());
                territorio.add(elemento.getElementsByTagName("territorio").item(0).getTextContent());
                sesso.add(elemento.getElementsByTagName("sesso").item(0).getTextContent());
                appunti.add(elemento.getElementsByTagName("appunti").item(0).getTextContent());
                prossimavisita.add(elemento.getElementsByTagName("prossimavisita").item(0).getTextContent());

            }
        }

        //recupero la lista del layout
final ListView mylist=(ListView) findViewById(R.id.ListViewElencoNote);

        //creo e istruisco l adattatore
final ArrayAdapter <String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);

        final ArrayAdapter <String> adapter2=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,nome);

        //inietto i dati
mylist.setAdapter((adapter));

        mylist.setAdapter((adapter2));


    }
    catch (Exception e)

    {

        Toast.makeText(getBaseContext(),  "errore: " + e.getMessage() , Toast.LENGTH_LONG).show();

    }
}

Tengo a precisare che il file lo messo nella cartella dove stanno i file Java.

Grazie a tutti.

Offline berpao

  • Utente normale
  • ***
  • Post: 162
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Percorso file in android
« Risposta #1 il: 05 Settembre 2017, 08:13:45 CEST »
0
Ciao, il problema potrebbe essere la posizione del file. Hai scritto che lo hai messo nella cartella java, ma getAssets() lavora con le risorse, quindi credo che inizi a cercarlo partendo dalla cartella "/res", guarda la documentazione di getAssets https://developer.android.com/reference/android/content/res/Resources.html
Ti consiglio cmq di usare la cartella dei files reperibile con "context.getFilesDir()" e leggere/scrivere il file dentro li (per getFilesDir() vedi https://developer.android.com/reference/android/content/Context.html)
Ciao
P

Offline basicdany

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei p9
  • Sistema operativo:
    windows 7
Re:Percorso file in android
« Risposta #2 il: 05 Settembre 2017, 10:08:34 CEST »
0
Ciao, grazie per la risposta.

Praticamente cosa dovrei modificare alla seguente riga di codice se metto il file xml nella cartella "res" :



        Document doc = manipoloDati.parse(getAssets().open("note.xml"));

Grazie tanto
       

Offline berpao

  • Utente normale
  • ***
  • Post: 162
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Percorso file in android
« Risposta #3 il: 05 Settembre 2017, 11:03:38 CEST »
0
Credo che diventi una cosa tipo:

Codice (Java): [Seleziona]
Document doc =loadXML(context.getFilesDir()+"/note.xml");
dove loadXml è la seguente funzione:

Codice (Java): [Seleziona]
    public Document loadXML(String xmlFilePath) throws Exception {
        Document docXml=null;

        try {
            DocumentBuilderFactory fctr = DocumentBuilderFactory.newInstance();
            DocumentBuilder bldr = fctr.newDocumentBuilder();
            InputSource insrc = new InputSource(new FileReader(xmlFilePath));
            docXml=bldr.parse(insrc);

        } catch (Exception ex) {
            throw ex;
        }

        return docXml;
    }

Questa istruzione da per scontato che il file esista già, quindi se fino ad adesso lo hai creato manualmente, devi aggiungere del codice che, quando serve, crei il file xml in quella posizione (puoi vedere questo link per un esempio, ovviamente sostituendo il percorso che c'è con quello che serve a te https://examples.javacodegeeks.com/core-java/xml/parsers/documentbuilderfactory/create-xml-file-in-java-using-dom-parser-example/ ); da android studio non riesci a crearlo manualmente in quel percorso, perchè è un percorso relativo al device (dovrebbe essere /data/data/<nomeapp>/...); cmq con un piccolo debug riesci a vedere che percorso contiene context.getFilesDir() e agire di conseguenza...
Non ho testato il codice perchè l'ho modificato al volo, ma dovrebbe essere ok

fammi sapere se hai altri dubbi
P

Offline basicdany

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei p9
  • Sistema operativo:
    windows 7
Re:Percorso file in android
« Risposta #4 il: 06 Settembre 2017, 06:37:09 CEST »
0
ciao, ho inserito istruzione:

Document doc =loadXML(Context.getFilesDir()+"/note.xml");

nella procedura di lettura xml

ma mi genera errore su "getFilesDir()" :

"Non-static method 'getFilesDir()' cannot be referenced from a static context"

perche?

grazie tanto

Offline berpao

  • Utente normale
  • ***
  • Post: 162
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Percorso file in android
« Risposta #5 il: 06 Settembre 2017, 08:03:43 CEST »
0
I metodi statici sono metodi di classe non di istanza; ciò significa che devi chiamarli usando il nome della classe e non usando la variabile istanziata. Es:

Codice (Java): [Seleziona]
String myVar="istanza classe";
myVar.substring(0,1);

In questo caso "substring" è chiamato come metodo di istanza (abbiamo una istanza della classe String salvata nella variabile myVar)

Codice (Java): [Seleziona]
boolean b=String.valueOf("true");In questo secondo caso "valueOf" è chiamato come metodo della classe String (non abbiamo nessuna istanza come vedi)

L'errore ti dice che hai provato a chiamare getFilesDir() come metodo statico di Context, ma in realtà non è un metodo statico. Al posto di context, dovreti mettere il nome della variabile che contiene il context. In teoria dovrebbe essere la tua activity, quindi potresti anche ometterlo e usarlo così:

Codice (Java): [Seleziona]
Document doc =loadXML(getFilesDir()+"/note.xml");
come fai quando chiami "findViewById()"

Spero di essere stato chiaro
P

Offline basicdany

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei p9
  • Sistema operativo:
    windows 7
Re:Percorso file in android
« Risposta #6 il: 07 Settembre 2017, 06:43:43 CEST »
0
ciao per la sintassi ok, ma quando eseguo la procedura mi da msg di errore "no such file o directory"

ma mi chiedo dove devo mettere il file?

io metto questa istruzione:

//Document doc = manipoloDati.parse(getAssets().open("note.xml"));
            Document doc =loadXML(getFilesDir()+"/note.xml");

grazie

Offline berpao

  • Utente normale
  • ***
  • Post: 162
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Percorso file in android
« Risposta #7 il: 07 Settembre 2017, 08:15:00 CEST »
0
Ciao, il percorso base restituito da "getFilesDir()" credo che cambi su versioni diverse di android. Siccome immagino che il file lo crei e lo salvi via codice, dovresti in teoria avere una funzione che crea il file (usando getFilesDir() per recuperare il percorso base in cui salvarlo) e uno che lo legge (che è la nostra loadXml()) usando la stessa funzione getFilesFir; in questo modo ti sleghi da percorsi specifici/cablati e lasci al sistema l'onere di stabilire quale sia il percorso da salvare. Normalmente getFilesDir() dovrebbe fare riferimento a un percorso del tipo "/data/data/<nomepackage>/...", ma è un percorso non accessible da android studio perchè non esiste (lo hai solo durante la fase di debug e se installi l'app su un device); non puoi creare manualmente il file in questo percorso.
Spero di essere stato più chiaro...
P

PS
Cmq durante il debug metti un breakpoint sull'istruzione che chiamaloadXml e così vedi a quale percorso punta getFilesDir()

Offline basicdany

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei p9
  • Sistema operativo:
    windows 7
Re:Percorso file in android
« Risposta #8 il: 08 Settembre 2017, 06:34:45 CEST »
0
Ciao grazie,
quindi bisogna creare il file xml via codice e non manualmente, perchè e android che decide il percorso.

Per creare il file via codice hai qualche esempio su come fare questo?, in rete ce ne tanto, ma non si arriva a niente...

grazie tanto

Offline berpao

  • Utente normale
  • ***
  • Post: 162
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Percorso file in android
« Risposta #9 il: 08 Settembre 2017, 08:06:56 CEST »
0
Ciao, non ho esempi pronti, cercando su google ho trovato questo esempio che riassume un po' le modalità che puoi usare per creare il file (da una stringa, usando il DOM, usando una libreria open,ecc)

https://xjaphx.wordpress.com/2011/10/27/android-xml-adventure-create-write-xml-data/

Dagli un occhio e se non capisci qualcosa fammi sapere
Ciao
P

EDIT:
Scusa, ho visto che il link non tratta la creazione fisica del file, prova questo codice che ho scritto un po' al volo ma dovrebbe andare, se poi non capisci tutto e hai bisogno di info fammi sapere

public File createXml(String xml) {
   //In memory builder for xml file
   DocumentBuilderFactory fctr = DocumentBuilderFactory.newInstance();
   DocumentBuilder bldr = fctr.newDocumentBuilder();
   InputSource insrc = new InputSource(new StringReader(xml));
   docXml=bldr.parse(insrc);

   //Final xml file reference
   savedFile=new File(getFilesDir(), "file.xml");

   //Creating xml file
   TransformerFactory factory = TransformerFactory.newInstance();
   Transformer transformer = factory.newTransformer();
   Result result = new StreamResult(savedFile);
   Source source = new DOMSource(xmlDoc);
   transformer.transform(source, result);
   
   return savedFile
}

Aggiungi le opportune modifiche (try/catch e quant'altro)
Ciao
P
« Ultima modifica: 08 Settembre 2017, 08:20:21 CEST da berpao »

Offline basicdany

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei p9
  • Sistema operativo:
    windows 7
Re:Percorso file in android
« Risposta #10 il: 20 Settembre 2017, 06:31:37 CEST »
0
CIAO GRAZIE DI TUTTO, ALLA FINE HO REALIZZATO QUESTA PROCEDURA CHE PARE STIA PER SCRIVERE SU SD:

private File sd = Environment.getExternalStorageDirectory();
    private File f = new File(sd, "notecasa.txt");

    public void write (String Data)
    {
        FileWriter fw = null;
        BufferedWriter bw = null;
        try
        {
            fw = new FileWriter(f, true);
            bw = new BufferedWriter(fw);
            bw.write(Data);
            bw.close();
            fw.close();

            Toast.makeText(getBaseContext(),  "ok scrittura file" , Toast.LENGTH_LONG).show();

        }
        catch (IOException e)
        {
            Toast.makeText(getBaseContext(),  e.getMessage() , Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    }

HO ABILITATO NEL FILE MANIFEST LA SCRITTURA:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.notefacile.www.myapplication">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".InserisciNotaActivity" ></activity>
        <activity android:name=".VisualizzaNoteActivity"></activity>

    </application>

</manifest>

MA MI GENERA ERRORE CHE NON HA PERMESSO DI SCRITTURA SULLA SD...

COME POSSO RISOLVERE IL PROBLEMA ?

GRAZIE TANTO ATTENDO RISPOSTA

Offline berpao

  • Utente normale
  • ***
  • Post: 162
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Percorso file in android
« Risposta #11 il: 20 Settembre 2017, 07:55:15 CEST »
0
Ciao, strano. In generale quello che hai messo è l'unica permission richiesta secondo la documentazione che vedi qui
Inizierei con il dirti di postare lo stack trace dell'eccezione così da vedere bene il problema. Inoltre leggendo la documentazione ho notato queste righe:

Citazione
Because the external storage may be unavailable—such as when the user has mounted the storage to a PC or has removed the SD card that provides the external storage—you should always verify that the volume is available before accessing it

Io inizierei ad introdurre il codice di verifica che trovi qualche riga più sotto nella documentazione reperibile al link che ti ho messo su (che ti scrivo per comodità):

Codice (Java): [Seleziona]
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

Non vorrei che stessi debuggando con il device collegato al pc e magari la ssd l'ha montata per lo scambio file sul pc. Se fosse così rientri nella casistica descritta sopra
Fammi sapere
Ciao
P