Android 加速度センサー csvファイル出力
受付中
回答 1
投稿
- 評価
- クリップ 0
- VIEW 3,366
Androidで加速度の値をmicroSDにcsvファイルとして出力したいのですが
うまくいきません。加速度の値は取れていてグラフで表示できるようにしたのですが
アプリ終了後、指定したファイルに加速度の値が書き込まれていません。
参考としているHPはhttp://androidlab.blog119.fc2.com/blog-entry-20.htmlです。
マニュフェストにREAD_EXTERNAL_STORAGEとWRITE_EXTERNAL_STORAGE権限は与えています。実機を使っており、SDカードを入れているのですが何故でしょうか?
ご教授お願いいたします。
追記として、カレンダーのint year、int month、int dayでは「Valiable is never used」などと出ています。うまく使えていないのでしょうか?また参考にしているプログラム自体が動くのかが疑問だったので、書いてある通りのプログラムを実行した結果、加速度は画面上に出力はされますが、csvファイルとしては出ませんでした。お時間がある方は試していただきたいです、、、
コード
import android.os.Environment;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.List;
import android.content.Intent;
import android.app.Activity;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.util.Log;
import android.view.View;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
public class Sensor_Activity extends Activity implements SensorEventListener {
SensorManager manager;
Sensor sensor;
TextView xTextView;
TextView yTextView;
TextView zTextView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sensor_);
xTextView = (TextView) findViewById(R.id.xValue);
yTextView = (TextView) findViewById(R.id.yValue);
zTextView = (TextView) findViewById(R.id.zValue);
manager = (SensorManager) getSystemService(SENSOR_SERVICE);
sensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mChart = (LineChart) findViewById(R.id.linechart);
mChart.setDescription(""); // 表のタイトルを空にする
mChart.setData(new LineData()); // 空のLineData型インスタンスを追加
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
protected void onResume() {
super.onResume();
manager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_UI);
}
@Override
protected void onPause() {
super.onPause();
manager.unregisterListener(this);
}
@Override
public void onSensorChanged(SensorEvent event) {
xTextView.setText(String.valueOf(event.values[0]));
yTextView.setText(String.valueOf(event.values[1]));
zTextView.setText(String.valueOf(event.values[2]));
Calendar time = Calendar.getInstance();
int year = time.get(time.YEAR);
int month = time.get(time.MONTH);
int day = time.get(time.DAY_OF_MONTH);
int hour = time.get(time.HOUR_OF_DAY);
int minute = time.get(time.MINUTE);
int second = time.get(time.SECOND);
int ms = time.get(time.MILLISECOND);
String nowtime = String.valueOf(hour)+":"+String.valueOf(minute)+":"+ String.valueOf(second)+":" +String.valueOf(ms);
switch(event.sensor.getType()) {
//加速度
case Sensor.TYPE_ACCELEROMETER: {
//出力先
String FILE = "/sdcard/test.csv";
try {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(FILE, true), "UTF-8"));
String write_int = nowtime + "," +
String.valueOf(event.values[SensorManager.DATA_X]) + "," +
String.valueOf(event.values[SensorManager.DATA_Y]) + "," +
String.valueOf(event.values[SensorManager.DATA_Z]) + "\n";
bw.write(write_int);
bw.close();
} catch (UnsupportedEncodingException k) {
k.printStackTrace();
} catch (FileNotFoundException k) {
k.printStackTrace();
} catch (IOException k) {
k.printStackTrace();
}
TextView x = (TextView)findViewById(R.id.xValue);
x.setText("x" + String.valueOf(event.values[SensorManager.DATA_X]));
TextView y = (TextView)findViewById(R.id.yValue);
y.setText("y" + String.valueOf(event.values[SensorManager.DATA_Y]));
TextView z = (TextView)findViewById(R.id.zValue);
z.setText("z" + String.valueOf(event.values[SensorManager.DATA_Z]));
break;
}
}
LineData data = mChart.getLineData();
if (data != null) {
for (int i = 0; i < 3; i++) { // 3軸なのでそれぞれ処理
ILineDataSet set = data.getDataSetByIndex(i);
if (set == null) {
set = createSet(names[i], colors[i]);
data.addDataSet(set);
}
data.addEntry(new Entry(set.getEntryCount(), event.values[i]), i); // データを追加する
data.notifyDataChanged();
}
mChart.notifyDataSetChanged(); // 表示の更新のために変更を通知する
mChart.setVisibleXRangeMaximum(50); // 表示の幅を決定する
mChart.moveViewToX(data.getEntryCount()); // 最新のデータまで表示を移動させる
}
}
LineChart mChart;
String[] names = new String[]{"x-value", "y-value", "z-value"};
int[] colors = new int[]{Color.RED, Color.GREEN, Color.BLUE};
private LineDataSet createSet(String label, int color) {
LineDataSet set = new LineDataSet(null, label);
set.setLineWidth(2.5f); // 線の幅を指定
set.setColor(color); // 線の色を指定
set.setDrawCircles(false); // ポイントごとの円を表示しない
set.setDrawValues(false); // 値を表示しない
return set;
}
public void back3_button (View view) {
Intent intent = new Intent(this, Main2Activity.class);
startActivity(intent);
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/01/30 23:30
動くので実装は大丈夫です。
ログには以下のエラーがありました。
01-30 23:29:41.705 29999-29999/? W/System.err: java.io.FileNotFoundException: /sdcard/test.csv: open failed: EACCES (Permission denied)
01-30 23:29:41.705 29999-29999/? W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452)
01-30 23:29:41.705 29999-29999/? W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
01-30 23:29:41.705 29999-29999/? W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:127)
01-30 23:29:41.705 29999-29999/? W/System.err: at com.example.yoshihiro.sensorsd.MainActivity.onSensorChanged(MainActivity.java:86)
01-30 23:29:41.705 29999-29999/? W/System.err: at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:483)
01-30 23:29:41.705 29999-29999/? W/System.err: at android.os.MessageQueue.nativePollOnce(Native Method)
01-30 23:29:41.705 29999-29999/? W/System.err: at android.os.MessageQueue.next(MessageQueue.java:323)
01-30 23:29:41.705 29999-29999/? W/System.err: at android.os.Looper.loop(Looper.java:135)
01-30 23:29:41.705 29999-29999/? W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5451)
01-30 23:29:41.705 29999-29999/? W/System.err: at java.lang.reflect.Method.invoke(Native Method)
01-30 23:29:41.705 29999-29999/? W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-30 23:29:41.705 29999-29999/? W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-30 23:29:41.705 29999-29999/? W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
01-30 23:29:41.705 29999-29999/? W/System.err: at libcore.io.Posix.open(Native Method)
01-30 23:29:41.705 29999-29999/? W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
01-30 23:29:41.705 29999-29999/? W/System.err: at libcore.io.IoBridge.open(IoBridge.java:438)
01-30 23:29:41.705 29999-29999/? W/System.err: ... 11 more
01-30 23:29:41.708 29999-29999/? W/System.err: java.io.FileNotFoundException: /sdcard/test.csv: open failed: EACCES (Permission denied)
01-30 23:29:41.708 29999-29999/? W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452)
01-30 23:29:41.708 29999-29999/? W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
01-30 23:29:41.708 29999-29999/? W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:127)
01-30 23:29:41.708 29999-29999/? W/System.err: at com.example.yoshihiro.sensorsd.MainActivity.onSensorChanged(MainActivity.java:86)
01-30 23:29:41.708 29999-29999/? W/System.err: at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:483)
01-30 23:29:41.708 29999-29999/? W/System.err: at android.os.MessageQueue.nativePollOnce(Native Method)
01-30 23:29:41.708 29999-29999/? W/System.err: at android.os.MessageQueue.next(MessageQueue.java:323)
01-30 23:29:41.708 29999-29999/? W/System.err: at android.os.Looper.loop(Looper.java:135)
01-30 23:29:41.708 29999-29999/? W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5451)
01-30 23:29:41.708 29999-29999/? W/System.err: at java.lang.reflect.Method.invoke(Native Method)
01-30 23:29:41.708 29999-29999/? W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-30 23:29:41.708 29999-29999/? W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-30 23:29:41.709 29999-29999/? W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
01-30 23:29:41.709 29999-29999/? W/System.err: at libcore.io.Posix.open(Native Method)
01-30 23:29:41.709 29999-29999/? W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
01-30 23:29:41.709 29999-29999/? W/System.err: at libcore.io.IoBridge.open(IoBridge.java:438)
01-30 23:29:41.709 29999-29999/? W/System.err: ... 11 more
01-30 23:29:41.902 29999-29999/? W/System.err: java.io.FileNotFoundException: /sdcard/test.csv: open failed: EACCES (Permission denied)
01-30 23:29:41.902 29999-29999/? W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452)
01-30 23:29:41.902 29999-29999/? W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
01-30 23:29:41.903 29999-29999/? W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:127)
01-30 23:29:41.903 29999-29999/? W/System.err: at com.example.yoshihiro.sensorsd.MainActivity.onSensorChanged(MainActivity.java:86)
01-30 23:29:41.903 29999-29999/? W/System.err: at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:483)
01-30 23:29:41.903 29999-29999/? W/System.err: at android.os.MessageQueue.nativePollOnce(Native Method)
01-30 23:29:41.903 29999-29999/? W/System.err: at android.os.MessageQueue.next(MessageQueue.java:323)
01-30 23:29:41.903 29999-29999/? W/System.err: at android.os.Looper.loop(Looper.java:135)
01-30 23:29:41.903 29999-29999/? W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5451)
01-30 23:29:41.903 29999-29999/? W/System.err: at java.lang.reflect.Method.invoke(Native Method)
01-30 23:29:41.903 29999-29999/? W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-30 23:29:41.903 29999-29999/? W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-30 23:29:41.903 29999-29999/? W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
01-30 23:29:41.903 29999-29999/? W/System.err: at libcore.io.Posix.open(Native Method)
01-30 23:29:41.903 29999-29999/? W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
01-30 23:29:41.903 29999-29999/? W/System.err: at libcore.io.IoBridge.open(IoBridge.java:438)
01-30 23:29:41.903 29999-29999/? W/System.err: ... 11 more
01-30 23:29:41.905 29999-29999/? W/System.err: java.io.FileNotFoundException: /sdcard/test.csv: open failed: EACCES (Permission denied)
01-30 23:29:41.905 29999-29999/? W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452)
01-30 23:29:41.905 29999-29999/? W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
01-30 23:29:41.905 29999-29999/? W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:127)
01-30 23:29:41.905 29999-29999/? W/System.err: at com.example.yoshihiro.sensorsd.MainActivity.onSensorChanged(MainActivity.java:86)
01-30 23:29:41.905 29999-29999/? W/System.err: at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:483)
01-30 23:29:41.905 29999-29999/? W/System.err: at android.os.MessageQueue.nativePollOnce(Native Method)
01-30 23:29:41.905 29999-29999/? W/System.err: at android.os.MessageQueue.next(MessageQueue.java:323)
01-30 23:29:41.905 29999-29999/? W/System.err: at android.os.Looper.loop(Looper.java:135)
01-30 23:29:41.905 29999-29999/? W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5451)
01-30 23:29:41.905 29999-29999/? W/System.err: at java.lang.reflect.Method.invoke(Native Method)
01-30 23:29:41.905 29999-29999/? W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-30 23:29:41.905 29999-29999/? W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-30 23:29:41.905 29999-29999/? W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
01-30 23:29:41.906 29999-29999/? W/System.err: at libcore.io.Posix.open(Native Method)
01-30 23:29:41.906 29999-29999/? W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
2017/01/31 00:29
エラーログに権限が無いと出ています。
また、catch句で例外を無かったことにするような実装はエラーが発生しないので原因がわからなくなりますよ。