Search code examples
kotlinsplitbluetoothread-data

Debug is working but release not - Kotlin receives data via Bluetooth


I am working on Bluetooth receiving and sending data. I can send data via Bluetooth but it doesn't work the receive data. I want to get string data and split it. And the split data will show the list view. Since data import is not working, I created string data and called the split method, but it didn't work here either in a release. Can you help me? Here are my Activity codes;

        var mUUID: UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")
        var mBluetoothSocket: BluetoothSocket? = null
        lateinit var mProgress: ProgressDialog
        lateinit var mBluetoothAdapter: BluetoothAdapter
        var mIsConnected: Boolean = false
        lateinit var mAddress: String
        lateinit var inputStream: InputStream
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityListBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        mAddress = intent.getStringExtra(MainActivity.EXTRA_ADDRESS).toString()
        ConnectToDevice(this).execute()
        run()
        binding.deneme.setOnClickListener {
            sendCommand("denemebeyza")
            Log.d("mesajBT", "onCreate: mesaj gonderildi")
        }
        val string2: String = "deneme, deneme02K, deneme90,klm08B,bitti."
        splitList(string2)

    }


    private fun sendCommand(input: String) {
        if (mBluetoothSocket != null) {
            try {
                mBluetoothSocket!!.outputStream.write(input.toByteArray())
            } catch (e: IOException) {
                e.printStackTrace()
            }
        }
    }

  
    fun run() {

        val LOGTAG: String ="ReadListString"
        Log.i(LOGTAG, Thread.currentThread().name)
        val buffer = ByteArray(8)
        var bytes: Int
        val text1: TextView = binding.text2
        var readText : String
        Log.d("mesajBt", "mesaj metodu")

        //Loop to listen for received bluetooth messages
        if (mBluetoothSocket != null) {
            while (true) {
                bytes = try {
                    bytes = inputStream.read(buffer) ?:0
                    readText = String(buffer, 0, bytes)
                    Log.e("Arduino Message", readText)
                } catch (e: IOException) {
                    e.printStackTrace()
                    Log.d("Else", "message alinamadi.")
                    break
                }
                text1.text =readText
            }
        }
    }
    fun splitList(output: String) {
        val listView : ListView= binding.list1
        val textView: TextView= binding.text1
        if (mBluetoothSocket != null) {
            try {
                val list: List<String> = output.split(",").toList()
                var arrayAdapter: ArrayAdapter<*>
                for (it in list) {
                    Log.e("TAG", "splitList: $list ")
                    val list2: ArrayList<String> = ArrayList(list)
                    textView.text = list2.toString()
                }
                arrayAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, list)
                listView.adapter=arrayAdapter
            } catch (e: IOException) {
                e.printStackTrace()
            }
            // [A, B, C, D]
        }
    }

    private class ConnectToDevice(c: Context) : AsyncTask<Void, Void, String>() {
        private var connectSuccess: Boolean = true
        @SuppressLint("StaticFieldLeak")
        val context: Context = c
       

        @Deprecated("Deprecated in Java")
        override fun onPreExecute() {
            super.onPreExecute()
            mProgress = ProgressDialog.show(
                context,
                context.getString(R.string.connecting),
                context.getString(R.string.connecting)
            )
        }

        @SuppressLint("MissingPermission")
        override fun doInBackground(vararg p0: Void?): String? {
            try {
                if (mBluetoothSocket == null || !mIsConnected) {
                    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
                    val device: BluetoothDevice = mBluetoothAdapter.getRemoteDevice(mAddress)
                    mBluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(mUUID)
                    BluetoothAdapter.getDefaultAdapter().cancelDiscovery()
                    mBluetoothSocket!!.connect()
                    inputStream = mBluetoothSocket!!.inputStream
                }
            }catch (e: IOException) {
                connectSuccess = false
                e.printStackTrace()
            }
            return null
        }

        override fun onPostExecute(result: String?) {
            super.onPostExecute(result)
            if (!connectSuccess) {
                Log.i("data", "couldn't connect")
            } else {
                mIsConnected = true
            }
            mProgress.dismiss()
        }

    }
}

Here is debugged console log.e output

enter image description here

Thanks, advance :)

I/ReadList-run: main 
E/mesajBt: mesaj metodu 
W/BluetoothAdapter:getBluetoothService() called with no BluetoothManagerCallback
W/libEGL: EGLNativeWindowType 0xc9a7d808 disconnect failed 
W/libEGL:EGLNativeWindowType 0xc95be008 disconnect failed
I/InputMethodManager: startInputInner mService.startInputOrWindowGainedFocus E/ViewRootImpl:sendUserActionEvent() returned.
I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus

Solution

  • Since there will be commas between words in data coming from Bluetooth, I used a comma as a separator in the split method. After some research, I corrected a few mistakes. You can change the value of the bytes as 8-16-32-64 according to the incoming data type and size. Receive method is here

    private fun run() {
            //Loop to listen for received bluetooth messages
            if (mBluetoothSocket != null) {
    
                val TAG: String = "ReadList-run"
                Log.i(TAG, Thread.currentThread().name)
                val buffer = ByteArray(1024)
                var bytes: Int
                var readText: String
                Log.e("mesajBt", "mesaj metodu")
                while (true) {
                    try {
                        bytes = inputStream.read(buffer)
                        readText = String(buffer, 0, bytes)
                        Log.e("Arduino Message", readText)
                        splitlist(readText)
                        break
                    } catch (e: IOException) {
                        e.printStackTrace()
                        Log.d("Else", "message alinamadi.")
                        break
                    }
                }
            }
        }
    

    Here is my split method

     fun splitList(output: String) {
            if (mBluetoothSocket != null) {
                try {
                    val list: List<String> = output.split(",").toList()
                    for (it in list) {
                        Log.e("TAG", "splitList: $list ")
                    }
                } catch (e: IOException) {
                    e.printStackTrace()
                }
                // [A, B, C, D]
            }
        }
    

    enter image description here