Bluetooth связь в Android Cant получить сообщение - PullRequest
0 голосов
/ 28 октября 2019

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

package com.codeyard.teleprompter;

import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

public class bleutoothrevivedeletenow extends AppCompatActivity {
    static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    String address = null;
    BluetoothAdapter myBluetooth = null;
    BluetoothSocket btSocket = null;
    Button StartConnection;
    Button Disconnect;
    Button Recieve;
    TextView incomingData;
    InputStream mmInStream = null;
    String incomingMessage;
    StringBuilder messages;
    Thread ListenInput = new Thread() {
        @Override
        public void run() {
            try {

                mmInStream = btSocket.getInputStream();
                byte[] buffer = new byte[1024];
                int bytes;
                Toast.makeText(getApplicationContext(), "Thread started///", Toast.LENGTH_LONG).show();
                while (true) {
                    // Read from the InputStream
                    try {
                        if (mmInStream == null) {
                            Log.e("", "InputStream is null");
                        }
                        bytes = mmInStream.read(buffer);
                        incomingMessage = new String(buffer, 0, bytes);
                        messages.append(incomingMessage);
                        Toast.makeText(getApplicationContext(), "incoming message", Toast.LENGTH_LONG).show();
                        Toast.makeText(bleutoothrevivedeletenow.this, incomingMessage, Toast.LENGTH_LONG).show();
                        //TODO Remove this


                    } catch (Exception e) {
                        Toast.makeText(bleutoothrevivedeletenow.this, "128", Toast.LENGTH_SHORT).show();

                    }
                }
            } catch (Exception e) {
                Toast.makeText(bleutoothrevivedeletenow.this, "133", Toast.LENGTH_SHORT).show();
            }


        }
    };
    private boolean isBtConnected = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bleutoothrevivedeletenow);
        messages = new StringBuilder();
        SharedPreferences sharedPreferences;
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(bleutoothrevivedeletenow.this);
        address = sharedPreferences.getString("ADDRESS", "");
        StartConnection =  findViewById(R.id.button5);
        Disconnect =  findViewById(R.id.button6);
        incomingData = findViewById(R.id.textView);
        Recieve =  findViewById(R.id.button7);

        StartConnection.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                new ConnectBT().execute();


            }
        });
        Disconnect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (btSocket != null) //If the btSocket is busy
                {
                    try {
                        btSocket.close(); //close connection
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                finish();
            }
        });
        Recieve.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ListenInput.start();
                final Handler handler = new Handler();
                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        incomingData.setText(messages);
                        handler.postDelayed(this, 2000);

                    }
                };
                runnable.run();
            }
        });

    }

    private class ConnectBT extends AsyncTask<Void, Void, Void>  // UI thread
    {
        private boolean ConnectSuccess = true; //if it's here, it's almost connected

        @Override
        protected void onPreExecute() {
            Toast.makeText(getApplicationContext(), "Connecting....", Toast.LENGTH_LONG).show();
        }

        @Override
        protected Void doInBackground(Void... devices) //while the progress dialog is shown, the connection is done in background
        {
            try {
                if (btSocket == null || !isBtConnected) {
                    ActivityCompat.requestPermissions(bleutoothrevivedeletenow.this, new String[]{Manifest.permission.BLUETOOTH}, 1);
                    ActivityCompat.requestPermissions(bleutoothrevivedeletenow.this, new String[]{Manifest.permission.BLUETOOTH_ADMIN}, 1);
                    ActivityCompat.requestPermissions(bleutoothrevivedeletenow.this, new String[]{Manifest.permission.BLUETOOTH_PRIVILEGED}, 1);

                    myBluetooth = BluetoothAdapter.getDefaultAdapter();//get the mobile bluetooth device

                    BluetoothDevice dispositivo = myBluetooth.getRemoteDevice(address);

                    //connects to the device's address and checks if it's available
                    btSocket = dispositivo.createInsecureRfcommSocketToServiceRecord(myUUID);//create a RFCOMM (SPP) connection
                    BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
                    btSocket.connect();//start connection
                }
            } catch (IOException e) {
                ConnectSuccess = false;//if the try failed, you can check the exception here
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) //after the doInBackground, it checks if everything went fine
        {
            super.onPostExecute(result);

            if (!ConnectSuccess) {
                Toast.makeText(getApplicationContext(), "Connection Failed", Toast.LENGTH_SHORT).show();
                finish();
            } else {
                Toast.makeText(getApplicationContext(), "Connection Successful", Toast.LENGTH_SHORT).show();
                isBtConnected = true;
            }

        }

    }
}

PS Я предоставил весь код. этот код фактически принадлежит этому репозиторию github: https://github.com/IamMayankThakur/android-arduino-using-bluetooth Код сначала сгенерировал IllegalThreadException, но после отладки я отредактировал код, и теперь он не падает, но все еще не поступает данных

...