Оператор if (switch.isChecked ()) вызывает сбой моего приложения - PullRequest
0 голосов
/ 10 ноября 2018

Я создаю приложение, в котором Bluetooth управляет автомобилем Arduino.Я пытаюсь получить переключатель для включения и выключения двигателей (прямо сейчас светодиод), но когда я запускаю приложение со следующим кодом, оно выходит из строя.

if (on_off_switch.isChecked()) {
    command = "1";
    try {
        outputStream.write(command.getBytes()); //transmits the value of command to the bluetooth module
    } catch (IOException e) {
        e.printStackTrace();
    }
} else {
    command = "10";
    try {
        outputStream.write(command.getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Но когда я запускаю приложение без этого раздела кода, оно работает просто отлично.Но когда я запускаю его с кодом, приложение не запускается, и Logcat сообщает:

--------- начало сбоя 2018-11-10 14:22: 36.570 3311-3311 / com.example.btcar2 E / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основной Процесс: com.example.btcar2, PID: 3311 java.lang.RuntimeException: Невозможно запустить действие ComponentInfo {com.example.btcar2 / com.example.btcar2.MainActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод «void java.io.OutputStream.write (byte [])» для ссылки на пустой объект в android.app.ActivityThread.performLaunchActivity (ActivityThread.java): 2830) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2905) в android.app.ActivityThread.-wrap11 (неизвестный источник: 0) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1606)на android.os.Handler.dispatchMessage (Handler.java:105) на android.os.Looper.loop (Looper.java:169) на android.app.ActivityThread.main (ActivityThread.java:6595) на java.lang.reflect.Method.invoke (NativeMethod) в com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:240) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767) Вызывается: java.lang.NullPointerException: Попытка вызвать виртуальный метод 'void java.io.OutputStream.write (byte [])' для ссылки на пустой объект в com.example.btcar2.MainActivity.onCreate (MainActivity.java:51) в android.app.Activity.executeCreate (Activity.java:7016) в android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1214) в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2783) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java): 2905) в android.app.ActivityThread.-wrap11 (неизвестный источник: 0) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1606) в android.os.Handler.dispatchMessage (Handler.java:105)на android.os.Looper.loop (Looper.java:169) на android.app.ActivityThread.main (ActivityThread.java:6595) на java.lang.reflect.Method.invoke (нативный метод) на com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:240) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767)

Не знаюзнаю, как это исправить.Пожалуйста, просто напишите, если у вас есть вопрос, который может помочь моей ситуации, спасибо.

Вот остаток моего кода

public class MainActivity extends AppCompatActivity {
    final String DEVICE_ADDRESS = "00:12:12:24:06:48"; //MAC Address of Bluetooth Module
    private final UUID PORT_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");

    private BluetoothDevice device;
    private BluetoothSocket socket;
    private OutputStream outputStream;

    Button bluetooth_connect_btn;

    String command; //string variable that will store value to be transmitted to the bluetooth module

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

        Switch on_off_switch = (Switch) findViewById(R.id.on_off_switch);
        on_off_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                Log.v("Switch State=", "" + isChecked);
            }

        });

        if (on_off_switch.isChecked()) {
            command = "1";
            try {
                outputStream.write(command.getBytes()); //transmits the value of command to the bluetooth module
            } catch (IOException e) {
                e.printStackTrace();
            }

        } else {
            command = "10";
            try {
                outputStream.write(command.getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        bluetooth_connect_btn = (Button) findViewById(R.id.bluetooth_connect_btn);

        //Button that connects the device to the bluetooth module when pressed
        bluetooth_connect_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (BTint()) {
                    BTconnect();
                }

            }
        });

    }

    //Initializes bluetooth module
    public boolean BTint() {
        boolean found = false;

        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        if (bluetoothAdapter == null) //Checks if the device supports bluetooth
            Toast.makeText(getApplicationContext(), "Device doesn't support bluetooth", Toast.LENGTH_SHORT).show();

        if (!bluetoothAdapter.isEnabled()) //Checks if bluetooth is enabled. If not, the program will ask permission from the user to enable it
        {
            Intent enableAdapter = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableAdapter, 0);

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        Set<BluetoothDevice> bondedDevices = bluetoothAdapter.getBondedDevices();

        if (bondedDevices.isEmpty()) //Checks for paired bluetooth devices
            Toast.makeText(getApplicationContext(), "Please pair the device first", Toast.LENGTH_SHORT).show();
        else {
            for (BluetoothDevice iterator : bondedDevices) {
                if (iterator.getAddress().equals(DEVICE_ADDRESS)) {
                    device = iterator;
                    found = true;
                    break;
                }
            }
        }

        return found;
    }

    public boolean BTconnect() {
        boolean connected = true;

        try {
            socket = device.createRfcommSocketToServiceRecord(PORT_UUID); //Creates a socket to handle the outgoing connection
            socket.connect();

            Toast.makeText(getApplicationContext(),
                    "Connection to bluetooth device successful", Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            e.printStackTrace();
            connected = false;
        }

        if (connected) {
            try {
                outputStream = socket.getOutputStream(); //gets the output stream of the socket
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return connected;
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

}

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Как сказал Амджад Алваре, объект outputStream является нулевым. Вы можете видеть это из этого утверждения в Logcat:

java.lang.NullPointerException: попытка вызвать виртуальный метод void java.io.OutputStream.write (byte []) 'для ссылки на пустой объект

Поставив этот код

if (on_off_switch.isChecked()) {
    command = "1";
    try {
        outputStream.write(command.getBytes()); //transmits the value of command to the bluetooth module
    } catch (IOException e) {
        e.printStackTrace();
    }
} else {
    command = "10";
    try {
        outputStream.write(command.getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

в onCreate вы пытаетесь выполнить некоторые действия с модулем Bluetooth, не убедившись, что у вас есть соединение.

Я не знаю ваш дизайн и чего вы пытаетесь достичь. Но я могу предложить поместить код выше в отдельный метод, подобный этому:

private void performAction() {
    if (on_off_switch.isChecked()) {
        command = "1";
        try {
            outputStream.write(command.getBytes()); //transmits the value of command to the bluetooth module
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        command = "10";
        try {
            outputStream.write(command.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

А затем позвоните в BTconnect(), если хотите что-то сделать сразу после установления соединения:

    // code before
    if (connected) {
        try {
            outputStream = socket.getOutputStream(); //gets the output stream of the socket
            performAction();  // call it here
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Или вызвать этот метод в onCheckedChanged

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    Log.v("Switch State=", "" + isChecked);
    performAction();  // call it here
}
0 голосов
/ 10 ноября 2018

outputStream равно нулю. Вы должны создать новый объект, как то, что вы делаете в BTconnect() outputStream = socket.getOutputStream();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...