Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在android中读取和写入有关加速计的数据?_Java_Android - Fatal编程技术网

Java 如何在android中读取和写入有关加速计的数据?

Java 如何在android中读取和写入有关加速计的数据?,java,android,Java,Android,我正在尝试为android编写一个步进计数器。它目前在一个活动中包括四个按钮: 开始记录存储在arraylist中的加速计数据的按钮。arraylist接受类型跟踪,这是我创建的一个类,用于保存一个传感器更改的数据。我还有一个停止按钮,以及从文本文件读取或写入数据的按钮 这个程序一直在arraylist上给我一个NullPointerException,我不知道为什么。任何帮助都将不胜感激 编辑:很抱歉,如果缩进被关闭或者代码不清楚,这是一项学校作业,而且我在一个严格的截止日期上,所以我必须在担

我正在尝试为android编写一个步进计数器。它目前在一个活动中包括四个按钮: 开始记录存储在arraylist中的加速计数据的按钮。arraylist接受类型跟踪,这是我创建的一个类,用于保存一个传感器更改的数据。我还有一个停止按钮,以及从文本文件读取或写入数据的按钮

这个程序一直在arraylist上给我一个NullPointerException,我不知道为什么。任何帮助都将不胜感激

编辑:很抱歉,如果缩进被关闭或者代码不清楚,这是一项学校作业,而且我在一个严格的截止日期上,所以我必须在担心可读性或效率之前赶紧让代码可用

编辑2:我不再得到任何异常,但是我仍然不能正确地读/写。我能够成功地写入一个文件,然后不知何故它停止了运行

package com.myApp.playpool;

    //imports

public class MainActivityBAK extends Activity implements SensorEventListener{

    //global fields (traces is instantiated here as new arraylist)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        acceleration=(TextView)findViewById(R.id.acceleration);
        startButton = (Button) findViewById(R.id.startButton);
        stopButton = (Button) findViewById(R.id.stopButton);
        readButton = (Button) findViewById(R.id.readButton);
        writeButton = (Button) findViewById(R.id.writeButton);

        sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sm.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);

        dataFilePath = getString(R.string.data_file_path);
        acceleration.setText("Current file: " + dataFilePath);

        lastCheck = System.currentTimeMillis();

        defineButtons();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    @Override
    public void onSensorChanged(SensorEvent event1) {

        if (running && ((System.currentTimeMillis() - lastCheck) > 1000)) { 
            acceleration.setText("X: "+event1.values[0]+"\nY: "+event1.values[1]+"\nZ: "+event1.values[2]);
            traces.add(new Trace(System.currentTimeMillis(), event1.values[0], event1.values[1], event1.values[2]));
            lastCheck = System.currentTimeMillis();
        }

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    public void defineButtons() { //defines onClick methods for the buttons

        startButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                traces = new ArrayList<Trace>();
                running = true;
            }
        });

        stopButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                traces = new ArrayList<Trace>();
                running = false;
            }
        });

        readButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                try {
                    scan = new Scanner(new File(dataFilePath));
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                while (scan.hasNext()) {
                    String str = scan.nextLine();
                    String [] strings = str.split(";");
                    double time = Double.parseDouble(strings[0]);
                    float x = Float.parseFloat(strings[0]), y = Float.parseFloat(strings[1]), z = Float.parseFloat(strings [2]);
                    traces.add(new Trace(time, x, y, z));
                }

                Toast.makeText(getBaseContext(),
                        ("Done reading to SD file: '" + dataFilePath + "'"),
                        Toast.LENGTH_SHORT).show();
                scan.close();
            }
        });

        writeButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                try {
                    File file = new File(dataFilePath);
                    print = new PrintWriter(file);
                    file.createNewFile();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                for (int i = 0; i < traces.size(); i++) {
                    double time = traces.get(i).time;
                    float x = traces.get(i).x, y = traces.get(i).y, z = traces.get(i).z;
                    print.println(time + ";" + x + ";" + y + ";" + z + ";");
                }
                print.close();
                Toast.makeText(getBaseContext(),
                        ("Done writing to SD file: '" + dataFilePath + "'"),
                        Toast.LENGTH_SHORT).show();
            }
        });

    }

}
package com.myApp.playpool;
//进口
公共类MainActivityBAK扩展活动实现SensorEventListener{
//全局字段(此处将跟踪实例化为新的arraylist)
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
加速度=(TextView)findViewById(R.id.加速度);
startButton=(按钮)findViewById(R.id.startButton);
stopButton=(按钮)findViewById(R.id.stopButton);
readButton=(Button)findViewById(R.id.readButton);
writeButton=(按钮)findViewById(R.id.writeButton);
sm=(SensorManager)getSystemService(Context.SENSOR\u服务);
加速计=sm.getDefaultSensor(传感器类型\加速计);
sm.registerListener(这个,加速计,传感器管理器,传感器延迟游戏);
dataFilePath=getString(R.string.data\u file\u path);
acceleration.setText(“当前文件:“+dataFilePath”);
lastCheck=System.currentTimeMillis();
定义按钮();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.activity\u主菜单);
返回true;
}
@凌驾
传感器更改时的公共无效(传感器事件1){
如果(正在运行&((System.currentTimeMillis()-lastCheck)>1000)){
acceleration.setText(“X:+event1.values[0]+”\nY:+event1.values[1]+“\nZ:+event1.values[2]);
添加(新跟踪(System.currentTimeMillis(),event1.values[0],event1.values[1],event1.values[2]);
lastCheck=System.currentTimeMillis();
}
}
@凌驾
精度更改时的公共无效(传感器,int精度){
}
public void defineButtons(){//为按钮定义onClick方法
setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
traces=新的ArrayList();
运行=真;
}
});
setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
traces=新的ArrayList();
运行=错误;
}
});
setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
试一试{
扫描=新扫描仪(新文件(dataFilePath));
}catch(filenotfounde异常){
e、 printStackTrace();
}
while(scan.hasNext()){
String str=scan.nextLine();
String[]strings=str.split(“;”);
double time=double.parseDouble(字符串[0]);
float x=float.parseFloat(字符串[0]),y=float.parseFloat(字符串[1]),z=float.parseFloat(字符串[2]);
添加(新的跟踪(时间,x,y,z));
}
Toast.makeText(getBaseContext(),
(“已完成对SD文件的读取:“+dataFilePath+”),
吐司。长度(短)。show();
scan.close();
}
});
setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
试一试{
文件文件=新文件(dataFilePath);
打印=新的PrintWriter(文件);
createNewFile();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
对于(int i=0;i
它似乎在写入方法的for循环中崩溃:

for (int i = 0; i < traces.size(); i++) { 
for(inti=0;i
如果单击“开始”或“停止”按钮,则仅初始化
跟踪
变量


如果在此之前单击“写入”按钮,则引用仍然为空。

看起来可能是
跟踪
尚未在
onSensorChanged()中初始化
或在您的
readButton.setOnClickListener
中,虽然没有完整的源代码或堆栈跟踪很难判断。如果
跟踪
是一个“//global”字段,则您可能应该在声明的位置对其进行初始化,如:

protected ArrayList<Trace> traces = new ArrayList<Trace>();

添加完整的堆栈跟踪。并准确地告诉我们它在哪一行崩溃。我不知道如何发布堆栈跟踪,只是
Writer writer = null;
try {
    OutputStream out = mContext.openFileOutput(dataFileName, Context.MODE_PRIVATE);
    writer = new OutputStreamWriter(out);

    for (int i = 0; i < traces.size(); i++) {
        double time = traces.get(i).time;
        float x = traces.get(i).x, y = traces.get(i).y, z = traces.get(i).z;
        writer.write(time + ";" + x + ";" + y + ";" + z + ";");
    }
}
finally {
    if (writer != null) {
        writer.close();
    }
}