Android Studio - ошибка соединения с устройством, приводящая к закрытию сокета - PullRequest
0 голосов
/ 25 мая 2018

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

     public class BluetoothConnection extends Thread {

        private final BluetoothSocket mmSocket;
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;
        byte[] buffer;
        BluetoothAdapter mmAdapter;


        // Unique UUID for this application, you may use different
        private static final UUID MY_UUID = UUID
                .fromString("eb58f747-a241-4ccb-935d-04ac6039895d");



        public BluetoothConnection(BluetoothDevice device) {

            BluetoothSocket tmp = null;
            mmAdapter = null;
            System.out.println("\n\n\n\n\n\n print is working? \n\n\n\n\n\n");

            // Get a BluetoothSocket for a connection with the given BluetoothDevice
            try {
                tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
            } catch (IOException e) {
                e.printStackTrace();
            }
            mmSocket = tmp;

            //now make the socket connection in separate thread to avoid FC
            Thread connectionThread  = new Thread(new Runnable() {

                @Override
                public void run() {
                    // Always cancel discovery because it will slow down a connection
                    Log.d("workkkkkk","$$$$$$$$$$$$$$$$****** printingggggg ******$$$$$$$$$$$$$$$$");

                    //mmAdapter.cancelDiscovery();


                }
            });

            connectionThread.start();

            InputStream tmpIn = null;
            OutputStream tmpOut = null;

            // Get the BluetoothSocket input and output streams
            try {
                try {
                    // This is a blocking call and will only return on a
                    // successful connection or an exception
                    mmSocket.connect();


                    System.out.println("\n\n\n\n\n\n socket connected\n\n\n\n\n\n");

                } catch (IOException e) {
                    //connection to device failed so close the socket
                    try {
                        mmSocket.close();
                        System.out.println("\n\n\n\n\n\n socket closed\n\n\n\n\n\n");

                    } catch (IOException e2) {
                        System.out.println("\n\n\n\n\n\n in catch\n\n\n\n\n\n");

                        e2.printStackTrace();
                    }
                }

                tmpIn = mmSocket.getInputStream();
                tmpOut = mmSocket.getOutputStream();
                buffer = new byte[1024];
            } catch (IOException e) {
                e.printStackTrace();
            }

            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }


        public void run() {

            // Keep listening to the InputStream while connected
            while (true) {
                try {
                    //read the data from socket stream
                    if(mmInStream != null) {
                        mmInStream.read(buffer);

                    }
                    // Send the obtained bytes to the UI Activity
                } catch (IOException e) {
                    //an exception here marks connection loss
                    //send message to UI Activity
                    break;
                }
            }
        }

        public void write(byte[] buffer) {
            try {
                //write the data to socket stream
                if(mmOutStream != null)
                mmOutStream.write(buffer);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public void cancel() {
            try {
                mmSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }



    }

Это выполняется в моем классе DeviceList, который находится здесь.Я сталкиваюсь с несколькими проблемами здесь, но большая из них относится к BluetoothConnection.java, однако я не уверен, что проблема происходит из-за этого класса.

package com.example.curie.fairbanks_01;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothSocket;

import android.app.Activity;
import android.os.Bundle;
import java.io.IOException;

import android.util.Log;
import android.view.View;
import android.view.MenuItem;

import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.Switch;
import android.widget.Toast;
import android.content.Intent;


import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;

public class DeviceList extends Activity {

    Button deviceSearch;
    Switch btSwitch;


    private BluetoothAdapter BA;
    private Set<BluetoothDevice>pairedDevices;
    private String instrumentName;
    private UUID instrumentUUID;
    BluetoothSocket socket;
    BluetoothConnection connector;

    ListView lv;
    public static BluetoothDevice instrument;
    PopupMenu pMenu;
    ArrayList<MenuItem> popupList;
    ArrayList<BluetoothDevice> list;

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

        deviceSearch = (Button) findViewById(R.id.device_search);
        deviceSearch.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                PopupMenu popup = new PopupMenu(DeviceList.this, findViewById(R.id.device_search));
                pairedDevices = BA.getBondedDevices();

                list = new ArrayList<BluetoothDevice>();
                for (BluetoothDevice bt : pairedDevices) {

                    list.add(bt);
                    popup.getMenu().add(bt.getName());
                    popup.show();
                }

                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    public boolean onMenuItemClick(MenuItem item) {


                        ArrayList<BluetoothDevice> deviceArrayList = new ArrayList<BluetoothDevice>(pairedDevices);

                        Toast.makeText(DeviceList.this, "Testing: " + item.getTitle(), Toast.LENGTH_SHORT).show();

                       // instrument = deviceArrayList.get(deviceArrayList.indexOf(item.getItemId()));
                        instrument = deviceArrayList.get(0);

                        connector = new BluetoothConnection(instrument);
                        connector.run();
                        Toast.makeText(DeviceList.this, "Connected to : " + item.getTitle(), Toast.LENGTH_SHORT).show();
                        Intent myIntent = new Intent(DeviceList.this, InputActivity.class);
                        DeviceList.this.startActivity(myIntent);
                        return true;
                    }
                });

            }
                });


         btSwitch = (Switch) findViewById(R.id.switch1);

        BA =BluetoothAdapter.getDefaultAdapter();
        lv =(ListView) findViewById(R.id.listView);

        if(BA.isEnabled())
            btSwitch.setChecked(true);
        else
            btSwitch.setChecked(false);
//        pMenu = new PopupMenu(this,findViewById(R.id.device_search));

        }



    public void list(View v){
//        pairedDevices = BA.getBondedDevices();
//
//        ArrayList list = new ArrayList();
//
//        for(BluetoothDevice bt : pairedDevices){
//
//            list.add(bt.getName());
//            pMenu.getMenu().add(bt.toString());
//        }

        Toast.makeText(getApplicationContext(), "Showing Paired Devices",Toast.LENGTH_SHORT).show();

        final ArrayAdapter adapter = new  ArrayAdapter(this,android.R.layout.simple_list_item_1, list);

        lv.setAdapter(adapter);
    }


    public void onOff(View v)
    {
        if(BA.isEnabled())
        {
                BA.disable();
                Toast.makeText(getApplicationContext(), " BT Turned off" ,Toast.LENGTH_LONG).show();
        }
        else
        {             BA.enable();
             Toast.makeText(getApplicationContext(), "BT Turned on" ,Toast.LENGTH_LONG).show();
        }
    }

    public static BluetoothDevice getInstrument() {
        return instrument;
    }
}

это то, что работает на консоли, когда я выбираю устройство, к которому я хотел бы подключиться:

I/System.out: $$$$$$$$$$$$$$$$****** in constructor ******$$$$$$$$$$$$$$$$
        D/workkkkkk: $$$$$$$$$$$$$$$$****** printingggggg ******$$$$$$$$$$$$$$$$
        D/BluetoothUtils: isSocketAllowedBySecurityPolicy start : device null
        D/BluetoothSocket: connect(): myUserId = 0
        W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
        I/System.out: $$$$$$$$$$$$$$$$****** socket closed ******$$$$$$$$$$$$$$$$
        D/BluetoothSocket: getInputStream(): myUserId = 0
        getOutputStream(): myUserId = 0

Почему оно не подключается при попытке?

...