0

私はアンドロイドが初めてで、まだそれで遊んでいます。しかし、最近問題が発生して行き詰まりました。加速度計からデータを取得し、chartengine を使用してリアルタイムでプロットしようとしています。最初に加速度計からのデータを保存してからプロットするチュートリアルを見つけました。エミュレーターで実行できますが、Jelly Bean を実行している Nexus 4 にデプロイすると、アプリケーションがクラッシュします。理由が分からないようです。何か提案はありますか?

public class MainActivity extends Activity implements SensorEventListener,OnClickListener {

private Button butStart, butStop;
private LinearLayout layout;
private boolean started = false;
private SensorManager sensorManager;


private static GraphicalView view;
private LineChart line = new LineChart();
private long t;

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


    layout = (LinearLayout) findViewById(R.id.chart_container);
    sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    new ArrayList<AccelemoterData>();


    butStart = (Button) findViewById(R.id.butStart);
    butStop = (Button) findViewById(R.id.butStop);

    butStart.setOnClickListener(this);
    butStop.setOnClickListener(this);

    butStart.setEnabled(true);
    butStop.setEnabled(false);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // TODO Auto-generated method stub

}

@Override
public void onSensorChanged(SensorEvent event) {
    if (started) {

        double x = event.values[0];
        double y = event.values[1];
        double z = event.values[2];
        long time = System.currentTimeMillis();
        AccelemoterData data = new AccelemoterData(time, x, y, z);

        line.addNewData(data, t);
        view.repaint();




    }
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.butStart:

        view = line.getView(this);
        setContentView(view);
        butStop.setEnabled(true);
        butStart.setEnabled(false);
        new ArrayList<AccelemoterData>();
        started = true;
        t = System.currentTimeMillis();
        Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(this, accelerometer,SensorManager.SENSOR_DELAY_FASTEST);


        break;
    case R.id.butStop:
        butStop.setEnabled(false);
        butStart.setEnabled(true);
        started = false;
        sensorManager.unregisterListener(this);
        layout.removeAllViews();

        break;
    default:
        break;

    }




}

}

public class LineChart {

private GraphicalView view;



private TimeSeries xSeries = new TimeSeries("X");
private TimeSeries ySeries = new TimeSeries("Y");
private TimeSeries zSeries = new TimeSeries("Z");

private XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();

XYSeriesRenderer xRenderer = new XYSeriesRenderer();
XYSeriesRenderer yRenderer = new XYSeriesRenderer();
XYSeriesRenderer zRenderer = new XYSeriesRenderer();

XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();

public LineChart() {


    dataset.addSeries(xSeries);
    dataset.addSeries(ySeries);
    dataset.addSeries(zSeries);


    xRenderer.setColor(Color.RED);
    xRenderer.setPointStyle(PointStyle.CIRCLE);
    xRenderer.setFillPoints(true);
    xRenderer.setLineWidth(1);
    xRenderer.setDisplayChartValues(false);


    yRenderer.setColor(Color.GREEN);
    yRenderer.setPointStyle(PointStyle.CIRCLE);
    yRenderer.setFillPoints(true);
    yRenderer.setLineWidth(1);
    yRenderer.setDisplayChartValues(false);


    zRenderer.setColor(Color.BLUE);
    zRenderer.setPointStyle(PointStyle.CIRCLE);
    zRenderer.setFillPoints(true);
    zRenderer.setLineWidth(1);
    zRenderer.setDisplayChartValues(false);


    multiRenderer.setXLabels(0);
    multiRenderer.setLabelsColor(Color.RED);
    multiRenderer.setChartTitle("t vs (x,y,z)");
    multiRenderer.setXTitle("Sensor Data");
    multiRenderer.setYTitle("Values of Acceleration");
    multiRenderer.setZoomButtonsVisible(true);

    multiRenderer.addSeriesRenderer(xRenderer);
    multiRenderer.addSeriesRenderer(yRenderer);
    multiRenderer.addSeriesRenderer(zRenderer);
}

public GraphicalView getView(Context context) 
{
    view =  ChartFactory.getLineChartView(context, dataset, multiRenderer);
    return view;
}

public void addNewData(AccelemoterData data, long t)
{
    xSeries.add(data.getTime()-t, data.getX());
    ySeries.add(data.getTime()-t, data.getY());
    zSeries.add(data.getTime()-t, data.getZ());

}

}

4

1 に答える 1

0

もちろん、クラス AccelerometerData が必要です。コードをコピーして貼り付け、私の基準を使用してクラス AccelerometerData を作成すると、うまくいきます。ただし、これを変更しました:

line.addNewData(data, time);

あなたの主な活動で。

クラス AccelerometerData (私の場合、私はスペイン語なので名前を変更しました) は、その名前を AccelerometerData に変更すると機能するはずです。

    public class DatosAcelerometro {
private long time;
private float x;
private float y;
private float z;

public DatosAcelerometro(long time, float x, float y,float z)
{
    this.time=time;
    this.x = x;
    this.y = y;
    this.z = z;
}

    public long getTime(){
           return time;
    }

public float getX() {
       return x;
}

public float getY() {
    return y;
}

public float getZ(){
    return z;
}

}

知らないエラーが修正されることを願っています。;)

于 2013-10-20T16:58:27.600 に答える