0

私は Android プログラミングが初めてで (最終年度のプロジェクトのために始めたばかりです)、現在のタスクに問題があります。Sphero の IMU にアクセスして、データをテキスト ファイルに出力しようとしています。Android アプリの作成方法とhttps://github.com/orbotix/Sphero-Android-SDKから入手したサンプルをいじる方法を学んだ後は、データを Android デバイスにストリーミングすることはそれほど問題ではありませんでした。

しかし、私は解決できないように見える出力データからテキストへのフェーズに行き詰まっていました。DataOutputStream およびその他の出力ストリーム メソッド (バッファ、バイトなど) を使用して、文字列メッセージおよび配列のテキスト ファイルを出力する方法を理解することができました。しかし、スフェロ加速度計ストリーミングからデータを出力する場合、アプリがエラーでクラッシュし続けるため、ファイルを出力できませんでした。

原因: java.lang.NullPointerException: null オブジェクト参照で仮想メソッド 'java.util.ArrayList com.orbotix.async.DeviceSensorAsyncMessage.getAsyncData()' を呼び出そうとしています

問題を引き起こしていると思われる出力部分は次のとおりです。

public void write_data() {
    double accelX = ((DeviceSensorAsyncMessage) asyncMessage).getAsyncData().get(0).getAccelerometerData().getFilteredAcceleration().x;
    ArrayList arrayList = new ArrayList();
    while (running == true) {
        arrayList.add(accelX);

        Toast.makeText(getApplicationContext(), "File Open", Toast.LENGTH_LONG).show();
        int sz = arrayList.size();
        for (int i = 0; i < sz; i++) {
            try {
                DataOutputStream dos = new DataOutputStream(new FileOutputStream(output_file, true));
                dos.writeUTF("" + arrayList);
                dos.writeChars("\n");
            } catch (IOException e) {
                Toast.makeText(getApplicationContext(), "Unable to copy data", Toast.LENGTH_LONG).show();
                //e.printStackTrace();
            }
        }
        try {
            dos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

過去の問題から NullPointException エラーをまだ理解していないため、出力方法が間違っているという事実についてはわかりません。誰かアドバイスをお願いします。アドバイスをいただければ幸いです。

4

1 に答える 1

0

たまたま同じ答えを求めていた方のために、私は初心者でコーディングの説明が苦手ですが、アクションを再構築することで問題を解決することができました。

これが私が書いた新しいコードで、最終的に私が望むように動作します:

public void handleAsyncMessage(AsyncMessage asyncMessage, Robot robot) {
    if( asyncMessage == null )
        return;

    //Check the asyncMessage type to see if it is a DeviceSensor message
    if( asyncMessage instanceof DeviceSensorAsyncMessage ) {
        DeviceSensorAsyncMessage message = (DeviceSensorAsyncMessage) asyncMessage;

        if( message.getAsyncData() == null
                || message.getAsyncData().isEmpty()
                || message.getAsyncData().get( 0 ) == null )
            return;

        //Retrieve DeviceSensorsData from the async message
        DeviceSensorsData data = message.getAsyncData().get( 0 );

        //Extract the accelerometer data from the sensor data
        displayAccelerometer(data.getAccelerometerData());

        //Extract attitude data (yaw, roll, pitch) from the sensor data
        displayAttitude(data.getAttitudeData());

        //Extract gyroscope data from the sensor data
        displayGyroscope( data.getGyroData() );

        writeAccelerometer(data.getAccelerometerData());
    }
}


public void writeAccelerometer(AccelerometerData accelerometer) {
    if (running == true) {
        try {
            dos.writeBytes(String.format("%.4f", accelerometer.getFilteredAcceleration().x));
            dos.writeChars("\n");
            dos.writeBytes(String.format("%.4f", accelerometer.getFilteredAcceleration().y));
            dos.writeChars("\n");
            dos.writeBytes(String.format("%.4f", accelerometer.getFilteredAcceleration().z));
            dos.writeChars("\n");
            System.out.println("Write Successful");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

それが私が共有しなければならないすべてであり、それが役立つことを願っています.

于 2016-04-03T06:07:30.083 に答える