Создание и сохранение файла журнала на устройстве в Android

Я планирую автоматизировать тестирование приложения, создав журнал для хранения некоторых результатов выполнения приложения, а последний раз проанализирует его с помощью фрагмента кода 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. Любая помощь в том, как это сделать, будет очень признательна.

Ответ 1

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

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

EDIT - я бы начал с ознакомления с рекомендациями в вышеупомянутых документах, чтобы сначала подтвердить состояние хранилища. У меня, к сожалению, нет опыта добавления файла на 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 (адаптера) и преобразую значение поля в строки и используя getBytes(), чтобы перейти к функции записи FileOutputStream. Я провел некоторое исследование, и есть немало других возможностей для написания файлов в Java/Android... например, для класса FileWriter, поэтому он нуждается в дальнейших исследованиях.

Ответ 2

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