Создание и хранение файла журнала на устройстве в Android - PullRequest
21 голосов
/ 20 апреля 2011

Я планирую автоматизировать тестирование приложения, создав журнал для хранения некоторых результатов выполнения приложения, а затем проанализировать его с помощью фрагмента кода Python и построить график.

Приложениеэто отпечаток WiFi, т. е. он собирает такую ​​информацию, как mac id, rss (уровень принимаемого сигнала и ранг (нормализованный rss)) об устройствах Wi-Fi в окружающей среде. Поэтому, чтобы протестировать это приложение, мне нужно отнести его в определенное место и записатьрезультаты (на данный момент вручную). Таким образом, logcat не будет служить цели.

Для автоматизации требуется 1. Хранение журнала на устройстве 2. Доступ к файлу журнала в системе через usb

Формат файла журнала:

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 

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

Теперь я знаю, что в основном существует 3 подхода к постоянному хранилищу (SharedPrefs в любом случае не подойдет для этого сценария). Я пробовал Внутреннее хранилище, но даже после установки режимафайл как MODE_WORLD_READABLE невозможно прочитать файл с помощью Device File Explorer в Eclipse .

Я все еще опасаюсь использовать внешнее хранилище для хранения журнала.Любое руководство о том, как записать файл в usb устройства, определенно поможет.

Я думал о структурировании данных, которые будут храниться, чтобы использовать SQLite для хранения.Но это устанавливает множество ненужных отношений (внешних и внутренних) между данными и делает их сложными.Если пути назад нет, то здесь будут драконы .

По сути, я хочу записать файл (как мне кажется, проще) в устройстве, а затем - прочитать его в моей системе, подключивк нему через USB.Любая помощь в том, как это сделать, будет очень признательна.

Ответы [ 2 ]

12 голосов
/ 22 апреля 2011

Я использовал очень простой подход для записи сообщений String в файл журнала, создав объект 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();

            }
        }

Теперь функция для записи нового сообщения в файл журнала.

    public void writeToFile(String message){
            try {
                out.write(message+"\n");
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
12 голосов
/ 20 апреля 2011

Осторожно или нет, Внешнее хранилище все еще может быть единственным путем. Без корневого доступа на устройстве вы не сможете получить ничего «внутреннего», если не будете в порядке с чтением в приложении на устройстве. Документы содержат довольно твердые рекомендации о том, где создавать внешние файлы, и если вы используете API уровня 8 или выше, есть пара дополнительных функций, которые можно использовать. Я уверен, что вы знаете эту страницу, но здесь она все равно: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

Если вам нужен какой-нибудь файл, например пример кода ... Я думаю, я мог бы выкопать немного ...

РЕДАКТИРОВАТЬ - я бы начал с того, что следовал инструкциям в приведенных выше документах, чтобы сначала подтвердить состояние хранилища. У меня, к сожалению, нет опыта добавления файла в Java, поэтому кто-то определенно будет более квалифицированным, чтобы ответить. Это не распространяется на добавление, но у меня есть подпрограмма резервного копирования в одном из моих личных приложений, которая выглядит примерно так:

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

Как только я готов к записи, я вытаскиваю пользовательский объект (запись) из ArrayAdapter (адаптера) и преобразую поле valuse в строки и использую getBytes () для передачи функции записи FileOutputStream. Я провел некоторое исследование, и есть довольно много других вариантов записи файлов в Java / Android ... например, класс FileWriter, поэтому он требует дальнейших исследований.

...