2011-04-20 9 views
19

Estoy planeando automatizar las pruebas de una aplicación creando un registro para almacenar algunos resultados de la ejecución de la aplicación y luego analizarlo con un código de Python y trazar un gráfico .Crear y guardar archivo de registro en el dispositivo en Android

La aplicación es una impresora de huellas WiFi, es decir, recoge información como mac id, rss (intensidad de señal recibida y rango (rss normalizado) sobre los dispositivos wifi en el entorno. Para probar esta aplicación tendría que tomarlo a la localización y registrar los resultados (a partir de ahora de forma manual). Así logcat no serviría a los fines.

automatización requiere 1. Almacenamiento del registro en el dispositivo 2. el acceso al archivo de registro en el sistema a través usb

Formato del archivo de registro:

Snapshot: 1 
Fingerprint: 1, Rank: 0.23424, Boolean: true 
Fingerprint: 2, Rank: 0.42344, Boolean: false 
Fingerprint: 3, Rank: 0.23425, Boolean: true 

Snapshot: 2 
Fingerprint: 1, Rank: 0.75654, Boolean: false 
Fingerprint: 2, Rank: 0.23456, Boolean: true 
Fingerprint: 3, Rank: 0.89423, Boolean: true 

................ 

Ahora sé que hay básicamente 3 enfoques para el almacenamiento persistente (SharedPrefs no se adaptaría a este escenario de todos modos). Intenté almacenamiento interno, pero incluso después de establecer el modo del archivo como MODE_WORLD_READABLE fue imposible read the file using Device File Explorer in Eclipse.

Todavía tengo dudas sobre el uso de almacenamiento externo para almacenar el registro. Cualquier tutorial sobre cómo escribir en un archivo en usb del dispositivo definitivamente ayudará.

Pensé en estructurar los datos que se almacenarán para usar SQLite para el almacenamiento. Pero esto establece muchas relaciones innecesarias (extranjeras y nacionales) entre los datos y los hace complejos. Si no hay forma de evitarlo, entonces here be dragons.

Básicamente quiero escribir en un archivo (más fácil, supongo) en el dispositivo y luego leerlo en mi sistema conectándose a él a través del usb. Cualquier ayuda sobre cómo hacerlo sería muy apreciada.

+1

vaya a http://code.google.com/p/microlog4android. – 100rabh

+0

@ 100rabh ¿Alguna sugerencia sobre cómo usarlo? – primpap

+0

Pregunta relacionada aquí, con una respuesta simple que muestra cómo escribir en la tarjeta SD: http://stackoverflow.com/questions/1756296/android-writing-logs-to-text-file – RenniePet

Respuesta

11

Tenga cuidado o no, el almacenamiento externo aún puede ser el único camino a seguir. Sin acceso raíz en el dispositivo, no se puede acceder a nada "interno" a menos que esté bien leyendo en una aplicación del dispositivo. Los documentos proporcionan pautas bastante sólidas sobre dónde crear archivos externos, y si está utilizando API Nivel 8 o superior, hay un par de funciones adicionales que se pueden utilizar. Estoy seguro de que sabe esta página, pero aquí está de todos modos: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

Si usted está en necesidad de cualquier archivo io ejemplo de código ... Creo que podría cavar algunos hasta ...

EDITAR - Comenzaría siguiendo las pautas en los documentos anteriores para confirmar primero el estado del almacenamiento. Desafortunadamente no tengo ninguna experiencia añadiendo un archivo en Java, por lo que alguien más definitivamente estaría más calificado para responder. Esto no cubre anexar, pero tengo una rutina de respaldo en una de mis aplicaciones personales que se ve más o menos así.

File backupPath = Environment.getExternalStorageDirectory(); 

    backupPath = new File(backupPath.getPath() + "/Android/data/com.maximusdev.bankrecord/files"); 

    if(!backupPath.exists()){ 
     backupPath.mkdirs(); 
    } 

    FileOutputStream fos; 
    try { 
     fos = new FileOutputStream(backupPath.getPath() + "/recordsbackup.txt"); 

     if(okaytowrite){ 
      for(int i = 0; i < count; ++i){ 
       entry = adapter.getItem(i); 
       fos.write(entry.toString().getBytes()); 
       fos.write("\n".getBytes()); 
       fos.write(String.valueOf(entry.dateTime).getBytes()); 
       fos.write("\n".getBytes()); 
       fos.write(String.valueOf(entry.sign).getBytes()); 
       fos.write("\n".getBytes()); 
       fos.write(String.valueOf(entry.cleared).getBytes()); 
       fos.write("\n".getBytes()); 
       fos.write(String.valueOf(entry.transDate).getBytes()); 
       fos.write("\n".getBytes()); 
       fos.write(entry.category.getBytes()); 
       fos.write("\n".getBytes()); 
      } 
     } 
     fos.close(); 

     Toast.makeText(this, "Backup Complete", Toast.LENGTH_SHORT).show(); 

    } catch (FileNotFoundException e) { 

     e.printStackTrace(); 

     AlertDialog.Builder delmessagebuilder = new AlertDialog.Builder(this); 

     delmessagebuilder.setCancelable(false); 

     delmessagebuilder.setMessage("File Access Error"); 

     delmessagebuilder.setNeutralButton("Okay", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       dialog.dismiss(); 
      } 
     }); 

     delmessagebuilder.create().show(); 

    } catch (IOException e) { 

     e.printStackTrace(); 

     AlertDialog.Builder delmessagebuilder = new AlertDialog.Builder(this); 

     delmessagebuilder.setCancelable(false); 

     delmessagebuilder.setMessage("File Access Error"); 

     delmessagebuilder.setNeutralButton("Okay", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       dialog.dismiss(); 
      } 
     }); 

     delmessagebuilder.create().show(); 
    } 

Una vez que estoy listo para escribir, estoy tirando de un objeto personalizado (entrada) a partir de un ArrayAdapter (adaptador) y la conversión de valuse campo para cuerdas y usando getBytes() para pasar a la función de escritura FileOutputStream . He investigado un poco y hay muchas otras opciones para escribir archivos en Java/Android ... la clase FileWriter, por ejemplo, por lo que merece más investigación.

+0

El archivo io ejemplo de escritura en el código de almacenamiento externo ayudaría. :) – primpap

+0

Veré lo que puedo hacer ... Java honestamente no es mi primer idioma, así que un ejemplo de algo como esto en C sería mi velocidad. Trataré de publicar algo en Java, pero podría incendiarse ... todo lo que hago ahora en Java es bastante hackoso en el mejor de los casos. Si alguien más quisiera intervenir mientras tanto, seguramente será bienvenido. Específicamente ... No he hecho ningún archivo adjunto, desafortunadamente. – Maximus

+0

Gracias por el interés. Leí que el archivo io para el almacenamiento externo no es diferente del de Java. Entonces puedo manejarlo – primpap

11

Utilicé un enfoque muy simple para escribir mensajes String en el archivo de registro creando un objeto FileWriter.

public static BufferedWriter out; 
     private void createFileOnDevice(Boolean append) throws IOException { 
       /* 
       * Function to initially create the log file and it also writes the time of creation to file. 
       */ 
       File Root = Environment.getExternalStorageDirectory(); 
       if(Root.canWrite()){ 
        File LogFile = new File(Root, "Log.txt"); 
        FileWriter LogWriter = new FileWriter(LogFile, append); 
        out = new BufferedWriter(LogWriter); 
        Date date = new Date(); 
        out.write("Logged at" + String.valueOf(date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + "\n")); 
        out.close(); 

      } 
     } 

Ahora la función para escribir un nuevo mensaje en el archivo de registro.

public void writeToFile(String message){ 
      try { 
       out.write(message+"\n"); 
       out.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
+0

Mucho mejor ejemplo, probablemente me prestará este método. – Maximus

+1

Necesita 'out.close()' después de la instrucción 'out.write (...)'. De lo contrario, no guardará la escritura. (Me di cuenta de esto por el camino difícil) – Randy

+0

Una vez que 'out.close()' el búfer, no puede volver a escribir en el archivo. es decir, si 'out.close()' en 'createFileOnDevice', necesita crear un' FileWriter' nuevo con la misma ruta en 'writeToFile' antes del' out.write() 'siguiente. – lanyusea

Cuestiones relacionadas