Как да свържете Bluetooth устройството, като щракнете върху елемента от списъка в Android?

Разработвам приложение, където трябва да се свържа с Bluetooth устройство на Android 4.3.

Мога да сканирам bluetooth устройството, но то не може да се свърже с bluetooth устройството.

Вече добавих разрешението в манифеста на следното:

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />

Моята операция е, когато натисна бутона SCAN, той ще сканира Bluetooth устройството и ще се покаже в ListView.

Когато щракна върху bluetooth устройството в ListView, то ще свърже bluetooth устройството на елемента.

Но когато щракна върху елемента устройство, приложението ще се срине и не знам защо...

Това е моят Java код:

     package com.example.preventthelost;


        import java.io.IOException;
        import java.net.Socket;
        import java.util.Set;
        import java.util.UUID;

        import android.os.Bundle;
        import android.app.Activity;
        import android.app.AlertDialog;
        import android.bluetooth.BluetoothAdapter;
        import android.bluetooth.BluetoothDevice;
        import android.bluetooth.BluetoothSocket;
        import android.widget.AdapterView;
        import android.widget.AdapterView.OnItemClickListener;
        import android.widget.ArrayAdapter;
        import android.widget.Button;
        import android.widget.ListView;
        import android.widget.TextView;
        import android.content.BroadcastReceiver;
        import android.content.Context;
        import android.content.DialogInterface;
        import android.content.Intent;
        import android.content.IntentFilter;
        import android.util.Log;
        import android.view.Menu;
        import android.view.View;
        import android.view.View.OnClickListener;
        import android.widget.Toast;

        public class DeviceList extends Activity {

            protected static final String tag = "TAG";
            private BluetoothAdapter mBluetoothAdapter;
            private static final int REQUEST_ENABLE_BT=1;
            private Button btn_cancel;
            private Button btn_scan;
            private ListView pair_devices_list;
            private ListView new_devices_list;
            private Set<BluetoothDevice> pairedDevice;
            private ArrayAdapter<String> newDevicelistArrayAdapter;
            private ArrayAdapter<String> pairDevicelistArrayAdapter;
            private final UUID my_UUID = UUID.fromString("00001802-0000-1000-8000-00805f9b34fb");
            //private final UUID my_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
            private BluetoothSocket socket;

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

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

                newDevicelistArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);
                new_devices_list = (ListView)findViewById(R.id.new_devices_list);
                new_devices_list.setAdapter(newDevicelistArrayAdapter);


                 **//check device support bluetooth or not**
                mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
                if(mBluetoothAdapter == null) {
                    Toast.makeText(this, "No support bluetooth", Toast.LENGTH_SHORT).show();
                    finish();
                    return;
                }else if(!mBluetoothAdapter.isEnabled()){ **//if bluetooth is close, than open it**
                    Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                    startActivityForResult(enableBTIntent, REQUEST_ENABLE_BT);
                }


                **//click the scan button**
                btn_scan.setOnClickListener(new OnClickListener() {         
                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub

                        //**list the bluetooth device**
                        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
                        registerReceiver(mReceiver, filter);
                        mBluetoothAdapter.startDiscovery();
                        newDevicelistArrayAdapter.clear();
                    }
                });

                //new_devices_list click
                new_devices_list.setOnItemClickListener(new OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                            long arg3) {
                        // TODO Auto-generated method stub          

                        mBluetoothAdapter.cancelDiscovery();
                        final String info = ((TextView) arg1).getText().toString();

             //get the device address when click the device item
                        String address = info.substring(info.length()-19);

                     //connect the device when item is click
              BluetoothDevice connect_device = mBluetoothAdapter.getRemoteDevice(address);

                    try {
                        socket = connect_device.createRfcommSocketToServiceRecord(my_UUID);
                        socket.connect();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    }
                });//************new_devices_list end


            }

            public final BroadcastReceiver mReceiver = new BroadcastReceiver() {

                @Override
                public void onReceive(Context context, Intent intent) {
                    // TODO Auto-generated method stub
                    String action = intent.getAction();
                    if(BluetoothDevice.ACTION_FOUND.equals(action)) {
                        BluetoothDevice bdevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);              
                        //short rssi = intent.getExtras().getShort(BluetoothDevice.EXTRA_RSSI);;
                        if(bdevice.getBondState() != BluetoothDevice.BOND_BONDED)   
                        newDevicelistArrayAdapter.add("\n" + bdevice.getName() + "\n" + bdevice.getAddress());
                        newDevicelistArrayAdapter.notifyDataSetChanged();

                    }
                }
            };


            protected void onDestroy() {

                super.onDestroy();
                if(mBluetoothAdapter != null)
                    mBluetoothAdapter.cancelDiscovery();
                unregisterReceiver(mReceiver);
            }

            public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.device_list, menu);
                return true;
            }
        }

когато въвеждам кода за свързване на следване в new_devices_list.setOnItemClickListener, винаги се срива.

//get the device address when click the device item
String address = info.substring(info.length()-19);

//connect the device when item is click
BluetoothDevice connect_device = mBluetoothAdapter.getRemoteDevice(address);

        try {
            socket = connect_device.createRfcommSocketToServiceRecord(my_UUID);
            socket.connect();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Не съм сигурен, но проблемът изглежда така в този ред:

BluetoothDevice connect_device = mBluetoothAdapter.getRemoteDevice(address);

Типът данни на address е String, а не адрес.

Но типът getRemoteDevice, който избирам, е String адрес.

ТАКА...не знам защо приложението винаги се срива, когато въвеждам кода за свързване в new_devices_list дори??

Не може ли да се използва в Android 4.3??

Може ли някой да ме научи??

Благодаря!!


person Wun    schedule 02.10.2013    source източник
comment
моля, публикувайте своя logcat, когато приложението ви се срине   -  person Arash GM    schedule 02.10.2013
comment
Показването на logcat xx:xx:xx:xx:xx:xx не е валиден Bluetooth адрес, така че проблемът е в типа данни на адреса, но типът getRemoteDevice, който избирам, е String адрес. Как да се направи?   -  person Wun    schedule 02.10.2013


Отговори (3)


Не беше ясно дали свързвате Bluetooth Classic или устройство с ниска консумация на енергия. Вашият код е за Classic, етикетът предполага Low Energy. В случай на ниска енергия, която бихте използвали

device.connectGatt(this, false, mGattCallback);

вместо

connect_device.createRfcommSocketToServiceRecord(my_UUID);
person barbazoo    schedule 06.10.2013

Избирате Tag BluetoothLowEnergy. Вашият въпрос е за BLE или стандартен Bluetooth? за BLE има друг подход за свързване. Можете да прочетете тук

person Mike    schedule 06.10.2013

Имах подобен проблем, но току що намерих решение.

Вместо да извадите 19 от info.length() in

String address = info.substring(info.length()-19);

вместо това извадете 17. Оригиналната публикация е публикувана преди почти година, но се надяваме, че все още е полезна за тези, които имат същия проблем.

person KitKat    schedule 28.07.2014