web-dev-qa-db-fra.com

Création et stockage d'un fichier journal sur l'appareil dans Android

Je prévois d'automatiser le test d'une application en créant un journal pour stocker certains résultats de l'exécution de l'application et ce dernier pour l'analyser en utilisant un morceau de code python et tracer un graphique.

L'application est une empreinte digitale WiFi, c'est-à-dire qu'elle recueille des informations telles que l'identifiant mac, rss (puissance et rang du signal reçu (rss normalisé) sur les appareils wifi dans l'environnement environnant. Donc, pour tester cette application, je devrais l'emmener à l'emplacement et enregistrer les résultats (à partir de maintenant manuellement). Donc, logcat ne servirait pas le but.

L'automatisation nécessite 1. Stockage du journal dans l'appareil 2. Accès au fichier journal dans le système via USB

Format du fichier journal:

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 

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

Maintenant, je sais qu'il existe essentiellement 3 approches pour le stockage persistant (SharedPrefs ne conviendrait pas à ce scénario de toute façon). J'ai essayé le stockage interne, mais même après avoir défini le mode du fichier sur MODE_WORLD_READABLE il était impossible de lire le fichier à l'aide de l'Explorateur de fichiers de périphériques dans Eclipse .

Je me méfie toujours de l'utilisation du stockage externe pour stocker le journal. Tout tutoriel sur la façon d'écrire dans un fichier en USB de l'appareil vous aidera certainement.

J'ai pensé à structurer les données à stocker afin d'utiliser SQLite pour le stockage. Mais cela établit de nombreuses relations inutiles (étrangères et nationales) entre les données et les rend complexes. S'il n'y a pas moyen de contourner, alors ici les dragons .

Fondamentalement, je veux écrire dans un fichier (plus facile je suppose) dans l'appareil et ce dernier le lire dans mon système en me connectant via USB. Toute aide sur la façon de le faire serait très appréciée.

22
Primal Pappachan

Méfiez-vous ou non, le stockage externe peut toujours être la seule solution. Sans accès root sur l'appareil, vous ne pouvez pas vraiment accéder à quelque chose de "interne" à moins que vous ne soyez d'accord avec la lecture dans une application sur l'appareil. Les documents fournissent des directives assez solides pour savoir où créer des fichiers externes, et si vous utilisez l'API niveau 8 ou supérieur, il existe quelques fonctions supplémentaires qui peuvent être utilisées. Je suis sûr que vous connaissez cette page, mais la voici quand même: http://developer.Android.com/guide/topics/data/data-storage.html#filesExternal

Si vous avez besoin d'un exemple de fichier io ... je pense que je pourrais en creuser ...

EDIT - Je commencerais par suivre les lignes directrices des documents ci-dessus pour confirmer d'abord l'état du stockage. Je n'ai malheureusement aucune expérience de l'ajout d'un fichier en Java, donc quelqu'un d'autre serait certainement plus qualifié pour répondre. Cela ne couvre pas l'ajout, mais j'ai une routine de sauvegarde dans l'une de mes applications personnelles qui ressemble à ceci.

    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();
    }

Une fois que je suis prêt à écrire, je tire un objet personnalisé (entrée) d'un ArrayAdapter (adaptateur) et convertis la valeur de champ en chaînes et j'utilise getBytes () pour passer à la fonction d'écriture FileOutputStream. J'ai fait quelques recherches et il y a pas mal d'autres options pour l'écriture de fichiers en Java/Android ... la classe FileWriter par exemple, donc elle mérite de plus amples recherches.

13
Maximus

J'ai utilisé une approche très simple pour écrire des messages String dans le fichier journal en créant un objet 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();

            }
        }

Maintenant, la fonction pour écrire un nouveau message dans le fichier journal.

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