web-dev-qa-db-ja.com

Androidのデバイスにログファイルを作成して保存する

pythonコードを使用して解析し、グラフをプロットして、アプリの実行結果の一部を保存するログを作成して、アプリケーションのテストを自動化することを計画しています。

アプリケーションはWiFiフィンガープリントです。つまり、周囲の環境にあるwifiデバイスに関するMAC ID、rss(受信信号強度、ランク(正規化されたrss)など)の情報を収集します。このアプリケーションをテストするには、ロケーションに移動し、結果を記録します(現時点では手動)。そのため、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に設定した後でも Eclipseのデバイスファイルエクスプローラーを使用してファイルを読み取る はできませんでした。

ログを保存するために外部ストレージを使用することにはまだ注意しています。デバイスのUSB内のファイルに書き込む方法に関するチュートリアルは、間違いなく役立ちます。

SQLiteをストレージとして使用するために、格納するデータを構造化することを考えました。しかし、これはデータ間に多くの不必要な関係(外国および国内)を確立し、それを複雑にします。回避策がない場合、 ここではドラゴン です。

基本的に私はデバイスでファイルに書き込みたいと思います(おそらく私はもっと簡単です)、後者の場合はシステムでそれをUSB経由で接続して読み取ります。それを行う方法についての助けがあれば大歓迎です。

22

気を付けてください。外部ストレージがまだ唯一の方法かもしれません。デバイスのrootアクセスがないと、デバイスのアプリケーション内での読み取りに問題がなければ、「内部」にアクセスすることはできません。ドキュメントは、外部ファイルを作成する場所についてかなり堅固なガイドラインを提供します。APIレベル8以上を使用している場合、使用できる追加の関数がいくつかあります。私はあなたがこのページを知っていると確信していますが、とにかくここにあります: http://developer.Android.com/guide/topics/data/data-storage.html#filesExternal

ファイルの例のコードが必要な場合は...掘り下げることができると思います...

編集-最初にストレージの状態を確認するために、上記のドキュメントのガイドラインに従うことから始めます。残念ながら、Javaでファイルを追加する経験はありません。そのため、他の誰かが間違いなく答える資格があります。これは追加についてはカバーしていませんが、個人用アプリの1つに次のようなバックアップルーチンがあります。

    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クラスです。

13
Maximus

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