質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

AndroidアプリでのCSV出力について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 10K+
退会済みユーザー

退会済みユーザー

前提・実現したいこと

Androidアプリで、加速度センサーの値をCSV出力したいです。
最終的にはグラフにしたりしたいのですが、今はとりあえず

“アプリでCSVファイルを出力”出来ればいいです。

発生している問題・エラーメッセージ

エラーはなく、実機上でセンサーの値を表示してはくれるのですが
(アプリは動作しているのですが)
CSVファイルが出力されません。

ここで解決策を教えていただいたら、文字列部分にセンサーの値を入れて
挑戦してみたいと考えています。

For文があるのは、センサーの値を配列に入れて、
それを出力しようと思っていた時期があったからです。

ソースコード

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.view.View.OnClickListener;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class  MainActivity extends AppCompatActivity implements SensorEventListener {
    private Sensor accSensor;
    private TextView mX;
    private TextView mY;
    private TextView mZ;
    private SensorManager manager;
    public int button_flag = 0;


    public void onAccuracyChanged(Sensor sensor, int n) {
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        manager = (SensorManager)this.getSystemService(SENSOR_SERVICE);
        accSensor = this.manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        Button start_btn = (Button) findViewById(R.id.button);
        Button stop_btn = (Button) findViewById(R.id.button2);

        start_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                button_flag = 1;
            }
        });

        stop_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                button_flag = 0;
            }
        });

        mX = (TextView)this.findViewById(R.id.textView);
        mY = (TextView)this.findViewById(R.id.textView4);
        mZ = (TextView)this.findViewById(R.id.textView6);

        try {
            //出力先を作成する
            FileWriter fw = new FileWriter(Environment.getDataDirectory().getPath()+"test.csv", false);
            PrintWriter pw = new PrintWriter(new BufferedWriter(fw));

            //内容を指定する
            pw.print("あ");
            pw.print(",");
            pw.print("い");
            pw.println();

            pw.print("01");
            pw.print(",");
            pw.print("02");
            pw.println();

            //ファイルに書き出す
            pw.close();

            //終了メッセージを画面に出力する
            System.out.println("出力が完了しました。");

        } catch (IOException ex) {
            //例外時処理
            ex.printStackTrace();
        }

    }


    @Override
    protected void onPause() {
        super.onPause();
        this.manager.unregisterListener((SensorEventListener)this, this.accSensor);
    }

    protected void onResume() {
        super.onResume();
        this.manager.registerListener((SensorEventListener) this, this.accSensor, 0);
    }

    public void onSensorChanged(SensorEvent sensorEvent) {
        if (sensorEvent.sensor.getType() ==  Sensor.TYPE_ACCELEROMETER) {
            if(button_flag==1){
                int[] [] arrn = new int[3] [100];
                for (int i = 1; i <= arrn.length; i++) {
                    Log.d("SENSOR_DATA", "TYPE_ACCELEROMETER1 = " + String.valueOf(sensorEvent.values[0]));
                    Log.d("SENSOR_DATA", "TYPE_ACCELEROMETER2 = " + String.valueOf(sensorEvent.values[1]));
                    Log.d("SENSOR_DATA", "TYPE_ACCELEROMETER3 = " + String.valueOf(sensorEvent.values[2]));

                    mX.setText("加速度センサーX:" + String.valueOf(sensorEvent.values[0]));
                    mY.setText("加速度センサーY:" + String.valueOf(sensorEvent.values[1]));
                    mZ.setText("加速度センサーZ:" + String.valueOf(sensorEvent.values[2]));
                }
            }else{
                mX.setText("止まっていますX");
                mY.setText("止まっていますY");
                mZ.setText("止まっていますZ");
            }
        }
    }
}

補足情報(言語/FW/ツール等のバージョンなど)

Android studio 1.5で、実機はXPERIA Z3c(SO-02G)です。
パソコンはwindoiws7、スマホはAndroid4.4です。

宜しくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

Environment.getDataDirectory().getPath()+"test.csv"


上記の箇所ですが。このパスが怪しいです。

Environment.getDataDirectory().getPath()+"/test.csv"


上記のようにしてみてはどうでしょうか。

また、ログキャットのログも追記してもらえないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/19 19:07

    曖昧な質問にも丁寧に答えていただき、ありがとうございます。

    マニフェストファイルをいじってもうまく出力できませんでした。
    どのようなことが理由として考えられますか?

    キャンセル

  • 2016/01/19 19:20 編集

    よく見るとEnvironment.getDataDirectory()が間違っていますね。
    ここはEnvironment.getExternalStorageDirectory()にするべきですね。

    また、アプリケーション固有のフォルダに保存する場合はActivity.getFilesDir()を、使うときいいですね。

    キャンセル

  • 2016/01/19 19:52

    無事出力されました!!
    ありがとうございます!

    ここからまた色々調整していきたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる