简体   繁体   中英

Android studio Bluetooth Connect App crash

I just added new code to my app which is supposed to connect via bluetooth to an arduino to control it... I'm fairly new to programming in Java. Compiling has not shown any errors so I booted it up on my device, but it crashes as soon as I tap on one device to connect it. Below you'll find my activity and my error logcat:

I hope someone can help :)

BT_Classic.java:

package com.car.bluetooth.bluetoothcar;

import androidx.appcompat.app.AppCompatActivity;

import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;



public class BT_Classic extends AppCompatActivity {

private Button pairedButton;
private Button discoveredButton;
private Button btonButton;
private Button btoffButton;
private ProgressDialog progress;
ListView listView;
BluetoothSocket bluetoothSocket;
BluetoothDevice bluetoothDevice;


private final static UUID uuid = UUID.fromString("fc5ffc49-00e3-4c8b-9cf1-6b72aad1001a");


private ArrayList<String> mDeviceList = new ArrayList<String>();

BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();


//BLUETOOTH VERBINDUNG


private static final int REQUEST_ENABLED = 0;
private static final int REQUEST_DISCOVERABLE = 0;

    private class ConnectingThread extends Thread {

        public ConnectingThread(BluetoothDevice device) {


            BluetoothSocket temp = null;
            BluetoothDevice bluetoothDevice = device;

            // Get a BluetoothSocket to connect with the given BluetoothDevice
            try {
                temp = bluetoothDevice.createRfcommSocketToServiceRecord(uuid);
            } catch (IOException e) {
                e.printStackTrace();
            }
            bluetoothSocket = temp;

        }


            public void run() {
        // Cancel any discovery as it will slow down the connection
        btAdapter.cancelDiscovery();

        try {
            // This will block until it succeeds in connecting to the device
            // through the bluetoothSocket or throws an exception
            bluetoothSocket.connect();
        } catch (IOException connectException) {
            connectException.printStackTrace();
            try {
                bluetoothSocket.close();
            } catch (IOException closeException) {
                closeException.printStackTrace();
            }
        }

        // Code to manage the connection in a separate thread
    /*
        manageBluetoothConnection(bluetoothSocket);
    */
    }

    // Cancel an open connection and terminate the thread
    public void cancel() {
        try {
            bluetoothSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}








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


    pairedButton = (Button) findViewById(R.id.pairedButton);
    discoveredButton = (Button) findViewById(R.id.discoveredButton);
    btonButton = (Button) findViewById(R.id.btonButton);
    btoffButton = (Button) findViewById(R.id.btoffButton);

    listView = (ListView) findViewById(R.id.listView);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            String  itemValue = (String) listView.getItemAtPosition(position);
            String MAC = itemValue;
            if (itemValue.length() >= 17) {
                MAC = itemValue.substring(itemValue.length() - 17);
            }
            BluetoothDevice bluetoothDevice = btAdapter.getRemoteDevice(MAC);
            // Initiate a connection request in a separate thread
            ConnectingThread t = new ConnectingThread(bluetoothDevice);
            t.start();
        }
    });

    //Pairing Button

    pairedButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Set<BluetoothDevice> pairedDevices = btAdapter.getBondedDevices();

            ArrayList<String> devices = new ArrayList<String>();

            for (BluetoothDevice bt : pairedDevices){
                devices.add(bt.getName());
                devices.add(bt.getAddress());

            }

            ArrayAdapter arrayAdapter = new ArrayAdapter(BT_Classic.this, android.R.layout.simple_list_item_1, devices);
            listView.setAdapter(arrayAdapter);
        }
    });








    discoveredButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if(!btAdapter.isDiscovering()){
                Intent bton = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                startActivityForResult(bton, REQUEST_DISCOVERABLE);
            }


        }
    });

    btonButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent bton = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(bton, REQUEST_ENABLED);
        }
    });

    btoffButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            btAdapter.disable();
        }
    });










}
}

Error Logcat:

2018-09-18 18:22:00.692 619-739/? E/ANDR-PERF-MPCTL: Invalid profile no. 0,total profiles 0 only
2018-09-18 18:22:00.872 619-739/? E/ANDR-PERF-MPCTL: Invalid profile no. 0, total profiles 0 only
2018-09-18 18:22:00.875 1633-1633/com.car.bluetooth.bluetoothcar E/InputEventReceiver: Exception dispatching input event.
2018-09-18 18:22:00.875 1633-1633/com.car.bluetooth.bluetoothcar E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
2018-09-18 18:22:00.883 1633-1633/com.car.bluetooth.bluetoothcar E/MessageQueue- 
   JNI: java.lang.StringIndexOutOfBoundsException: length=5; index=-12
    at java.lang.String.substring(String.java:1935)
    at com.car.bluetooth.bluetoothcar.BT_Classic$1.onItemClick(BT_Classic.java:126)
    at android.widget.AdapterView.performItemClick(AdapterView.java:318)
    at android.widget.AbsListView.performItemClick(AbsListView.java:1165)
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:3160)
    at android.widget.AbsListView.onTouchUp(AbsListView.java:4087)
    at android.widget.AbsListView.onTouchEvent(AbsListView.java:3846)
    at android.view.View.dispatchTouchEvent(View.java:11724)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2958)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2636)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2964)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2964)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2964)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2964)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2964)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2964)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
    at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:445)
    at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1828)
    at android.app.Activity.dispatchTouchEvent(Activity.java:3297)
    at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
    at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:407)
    at android.view.View.dispatchPointerEvent(View.java:11963)
    at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4810)
    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4624)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4162)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4215)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4181)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4308)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4189)
    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4365)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4162)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4215)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4181)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4189)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4162)
    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6736)
    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6675)
    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6636)
    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6839)
    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:192)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:325)
    at android.os.Looper.loop(Looper.java:142)
    at android.app.ActivityThread.main(ActivityThread.java:6592)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
2018-09-18 18:22:00.891 1633-1633/com.car.bluetooth.bluetoothcar E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.car.bluetooth.bluetoothcar, PID: 1633
java.lang.StringIndexOutOfBoundsException: length=5; index=-12
    at java.lang.String.substring(String.java:1935)
    at com.car.bluetooth.bluetoothcar.BT_Classic$1.onItemClick(BT_Classic.java:126)
    at android.widget.AdapterView.performItemClick(AdapterView.java:318)
    at android.widget.AbsListView.performItemClick(AbsListView.java:1165)
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:3160)
    at android.widget.AbsListView.onTouchUp(AbsListView.java:4087)
    at android.widget.AbsListView.onTouchEvent(AbsListView.java:3846)
    at android.view.View.dispatchTouchEvent(View.java:11724)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2958)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2636)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2964)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2964)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2964)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2964)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2964)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2964)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
    at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:445)
    at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1828)
    at android.app.Activity.dispatchTouchEvent(Activity.java:3297)
    at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
    at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:407)
    at android.view.View.dispatchPointerEvent(View.java:11963)
    at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4810)
    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4624)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4162)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4215)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4181)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4308)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4189)
    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4365)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4162)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4215)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4181)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4189)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4162)
    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6736)
    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6675)
    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6636)
    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6839)
    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:192)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:325)
    at android.os.Looper.loop(Looper.java:142)
    at android.app.ActivityThread.main(ActivityThread.java:6592)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)

2nd Error :

2018-09-18 21:00:03.412 3376-9580/? E/CastSocket: [MiniDeviceController-1] Failed to shutdown the output stream socket: nkr@19b00db.
java.net.SocketException: Socket is not connected
    at sun.nio.ch.Net.translateToSocketException(Net.java:129)
    at sun.nio.ch.Net.translateException(Net.java:166)
    at sun.nio.ch.Net.translateException(Net.java:172)
    at sun.nio.ch.SocketAdaptor.shutdownOutput(SocketAdaptor.java:424)
    at njq.c(:com.google.android.gms@13280018@13.2.80 (040308-211705629):16)
    at njz.run(:com.google.android.gms@13280018@13.2.80 (040308-211705629):18)
    at java.lang.Thread.run(Thread.java:764)
 Caused by: java.nio.channels.NotYetConnectedException
    at sun.nio.ch.SocketChannelImpl.shutdownOutput(SocketChannelImpl.java:842)
    at sun.nio.ch.SocketAdaptor.shutdownOutput(SocketAdaptor.java:422)
    at njq.c(:com.google.android.gms@13280018@13.2.80 (040308-211705629):16) 
    at njz.run(:com.google.android.gms@13280018@13.2.80 (040308-211705629):18) 
    at java.lang.Thread.run(Thread.java:764) 

The specific line String MAC = itemValue.substring(itemValue.length() - 17); from the below onItemClick() function is causing an java.lang.StringIndexOutOfBoundsException

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String itemValue = (String) listView.getItemAtPosition(position);
        String MAC = itemValue.substring(itemValue.length() - 17);
        BluetoothDevice bluetoothDevice = btAdapter.getRemoteDevice(MAC);
        // Initiate a connection request in a separate thread
        ConnectingThread t = new ConnectingThread(bluetoothDevice);
        t.start();
    }
});

To solve this, you might want to ensure that the length of the original String ( itemValue ) is greater than the length of the substring you are trying to extract --

String MAC = itemValue;
if (itemValue.length() >= 17) {
    MAC = itemValue.substring(itemValue.length() - 17);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM