2

I have a problem with my bluetooth scanner.I'm using a samsung A50 with android 11 .So my Bluetooth is supposed to check the surrounding bluetooth devices and then add them into an ArrayList and display it on screen with a recyclerview. The problem is I don't find any device. I tried to debug my code and It seems that my code doesn't go to mReceiver that's why I don't detect any device. The code was working last week I found the devices (I found the same device multiple times it's normal) but they didn't add to the ArrayList. So Now I'm asking you guys here is my code. I'm pretty sure I gave all the permissions necessary and even more and I also given the location permission to my app.

This is The Activity:

class ConnectionActivity : AppCompatActivity(),BluetoothOnItemClickListener{

    private lateinit var binding : ActivityConnectionBinding
    private lateinit var manager : RecyclerView.LayoutManager
    val dataset = Datasource().loadDataBluetooth()
    private val devices_list : ArrayList<BluetoothDevice> = ArrayList()

    var m_bluetoothAdapter : BluetoothAdapter? = null
    val REQUEST_ENABLE_BLUETOOTH = 1
    companion object{
        val EXTRA_ADDRESS :String = "Device_address"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityConnectionBinding.inflate(layoutInflater)
        setContentView(binding.root)

        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        supportActionBar?.title = "Bluetooth"

        m_bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
        if(m_bluetoothAdapter == null){
            Toast.makeText(this, "not supported", Toast.LENGTH_SHORT).show()
            return
        }
        if (!m_bluetoothAdapter!!.isEnabled){
            val enableBluetoothIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
            startActivityForResult(enableBluetoothIntent,REQUEST_ENABLE_BLUETOOTH)
            val discoverableIntent: Intent = Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE).apply {
                putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300)
            }
            startActivity(discoverableIntent)
        }else{
        discoverDevices()}
    }
    private val mReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            val action = intent.action
            if (BluetoothDevice.ACTION_FOUND == action) {
                // A Bluetooth device was found
                // Getting device information from the intent
                val device = intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
                if (device != null) {
                    devices_list.add(device)
                    println("SIZE : ${devices_list.size}")
                }
            }
        }
    }
    private fun discoverDevices(){
        if (m_bluetoothAdapter!!.isDiscovering) {
            // Bluetooth is already in mode discovery mode, we cancel to restart it again
            m_bluetoothAdapter!!.cancelDiscovery()
        }
        val bool = m_bluetoothAdapter?.startDiscovery()
        Log.i("", bool.toString())
        val filter = IntentFilter(BluetoothDevice.ACTION_FOUND)
        registerReceiver(mReceiver, IntentFilter(BluetoothDevice.ACTION_FOUND))
        println("Count : ${devices_list.size}")
        manager = LinearLayoutManager(this)
        binding.recycleView.adapter = ItemAdapter(devices_list,this)
        binding.recycleView.layoutManager = manager

    }


    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_ENABLE_BLUETOOTH) {
            if (resultCode == Activity.RESULT_OK) {
                if (m_bluetoothAdapter!!.isEnabled) {
                    Toast.makeText(this, "Bluetooth enabled", Toast.LENGTH_SHORT).show()
                    discoverDevices()
                } else {
                    Toast.makeText(this, "Bluetooth disabled", Toast.LENGTH_SHORT).show()
                }
            } else if (resultCode == Activity.RESULT_CANCELED) {
                Toast.makeText(this, "Bluetooth enabling has been canceled", Toast.LENGTH_SHORT).show()
            }
        }
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        val inflater: MenuInflater = menuInflater
        inflater.inflate(R.menu.menu_connection, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            R.id.ic_ip -> Toast.makeText(this, "IP", Toast.LENGTH_SHORT).show()
        }
        return super.onOptionsItemSelected(item)
    }

    override fun onStop() {
        super.onStop()
        unregisterReceiver(mReceiver)
    }
}

And This is the Adapter :

class ItemAdapter(private val devices : ArrayList<BluetoothDevice>, var clickListener: BluetoothOnItemClickListener): RecyclerView.Adapter<ItemAdapter.ItemViewHolder>(){
    inner class ItemViewHolder(val binding: ListItemBinding) : RecyclerView.ViewHolder(binding.root){
        fun bind(item : BluetoothDevice,action: BluetoothOnItemClickListener){
            binding.item?.StringNameB = item.name
            itemView.setOnClickListener {

                binding.item?.checked = true
                notifyItemChanged(bindingAdapterPosition)
            }
        }
    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        val adapterlayout = ListItemBinding.inflate(inflater,parent,false)
        return ItemViewHolder(adapterlayout)
    }

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        holder.bind(devices[position],clickListener)
        holder.binding.executePendingBindings()
    }

    override fun getItemCount(): Int {
        return devices.size
    }
}
interface BluetoothOnItemClickListener{

}

And this is my the permissions I have in my manifest

<uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
Bahaae
  • 21
  • 2

1 Answers1

1

You also need to request permissions at runtime. Have a look at the links below for more information:-

Youssif Saeed
  • 11,789
  • 4
  • 44
  • 72
  • But the links you gave me are related to BLE and I'm not using BLE. I know for a fact that if I want to scans devices I have to use location with android 10+ but even with the location I'm still not getting anything. from what I saw on my code it seems to not go on my receiver. Even when I ask for permissions at runtime. Is the code correct ? Did I do something wrong ? is it working for someone else ? – Bahaae Dec 29 '21 at 09:05