0

I have a code that transmits values over bluetooth There are two activities in it. I need to make sure that the bluetoothController variable is passed to another activity and I can also transfer values from the second activity.

Firts activity

package com.example.bluetoothmodule2
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothManager
import android.content.Context
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.SeekBar
import androidx.appcompat.content.res.AppCompatResources
import androidx.navigation.fragment.findNavController
import com.example.bluetoothmodule2.databinding.FragmentMainBinding
import com.example.bt_def.BluetoothConstants
import com.example.bt_def.bluetooth.BluetoothController
class MainFragment : Fragment(), BluetoothController.Listener{
 private lateinit var binding: FragmentMainBinding
 private lateinit var bluetoothController: BluetoothController
 private lateinit var btAdapter: BluetoothAdapter
 private var rm = 0 // руль
 private var gm = 0 // газ
 private var dm= 0 // коробка передач
 private var hm = 0 // сигнал
 override fun onCreateView(
 inflater: LayoutInflater, container: ViewGroup?,
 savedInstanceState: Bundle?
 ): View {
 binding = FragmentMainBinding.inflate(inflater, container, false)
 return binding.root
 }
 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
 super.onViewCreated(view, savedInstanceState)
 initBtAdapter()
 val pref = activity?.getSharedPreferences(
 BluetoothConstants.PREFERENCES, Context.MODE_PRIVATE
 )
 val mac = pref?.getString(BluetoothConstants.MAC, "")
 bluetoothController = BluetoothController(btAdapter)
 binding.bList.setOnClickListener {
 findNavController().navigate(R.id.action_FirstFragment_to_deviceListFragment)
 }
 binding.Villas.setOnClickListener {
 findNavController().navigate(R.id.action_mainFragment_to_villasFragment)
 }
 binding.Starter.setOnClickListener {
 findNavController().navigate(R.id.action_mainFragment_to_startFragment)
 }
 binding.bConnect.setOnClickListener {
 bluetoothController.connect(mac ?: "", this)
 }
 binding.RSend.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { // Слайдер для руля
 override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
 rm = progress
 binding.textR.text = "Руль: $rm"
 bluetoothController.sendMessage("rm=${rm};")
 }
 override fun onStartTrackingTouch(seekBar: SeekBar?) {
 }
 override fun onStopTrackingTouch(seekBar: SeekBar?) {
 }
 })
 binding.GSend.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{ //Слайдер для газа
 override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
 gm = progress
 binding.textG.text = "Газ: $gm"
 bluetoothController.sendMessage("gm=${gm};")
 }
 override fun onStartTrackingTouch(seekBar: SeekBar?) {
 }
 override fun onStopTrackingTouch(seekBar: SeekBar?) {
 }
 })
 binding.VSend.setOnClickListener {
 dm = 1
 bluetoothController.sendMessage("dm=${dm};")
 }
 binding.NSend.setOnClickListener {
 dm = 0
 bluetoothController.sendMessage("dm=${dm};")
 }
 binding.BSend.setOnClickListener {
 dm = 2
 bluetoothController.sendMessage("dm=${dm};")
 }
 binding.SSend.setOnClickListener {
 hm = 1
 bluetoothController.sendMessage("hm=${hm};")
 }
 binding.R0.setOnClickListener {
 binding.RSend.progress = 0
 bluetoothController.sendMessage("rm=${rm};")
 }
 }
 private fun initBtAdapter() {
 val bManager = activity?.getSystemService(Context.BLUETOOTH_SERVICE) as
 BluetoothManager
 btAdapter = bManager.adapter
 }
 override fun onReceive(message: String) {
 activity?.runOnUiThread {
 when (message) {
 BluetoothController.BLUETOOTH_CONNECTED -> {
 binding.bConnect.backgroundTintList = AppCompatResources
 .getColorStateList(requireContext(), R.color.red)
 binding.bConnect.text = "Disconnect"
 }
 BluetoothController.BLUETOOTH_NO_CONNECTED -> {
 binding.bConnect.backgroundTintList = AppCompatResources
 .getColorStateList(requireContext(), R.color.green)
 binding.bConnect.text = "Connect"
 }
 else -> {
 binding.tvStatus.text = message
 }
 }
 }
 }
}

Second activity

package com.example.bluetoothmodule2
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothManager
import android.content.Context
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.SeekBar
import com.example.bluetoothmodule2.databinding.FragmentVillasBinding
import com.example.bt_def.BluetoothConstants
import com.example.bt_def.bluetooth.BluetoothController
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
class VillasFragment : Fragment(), BluetoothController.Listener{
 private lateinit var binding: FragmentVillasBinding
 private lateinit var bluetoothController: BluetoothController
 private lateinit var btAdapter: BluetoothAdapter
 private var param1: String? = null
 private var param2: String? = null
 private var vt = 0 // тормоз вилы
 private var gt = 0 // газ вилы
 private var ut = 0 // Вверх/Вниз вилы
 private var ft = 0 // От себя/К себе
 override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 arguments?.let {
 param1 = it.getString(ARG_PARAM1)
 param2 = it.getString(ARG_PARAM2)
 }
 }
 override fun onCreateView(
 inflater: LayoutInflater, container: ViewGroup?,
 savedInstanceState: Bundle?
 ): View {
 binding = FragmentVillasBinding.inflate(inflater, container, false)
 return binding.root
 }
 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
 super.onViewCreated(view, savedInstanceState)
 initBtAdapter()
 val pref = activity?.getSharedPreferences(
 BluetoothConstants.PREFERENCES, Context.MODE_PRIVATE
 )
 val mac = pref?.getString(BluetoothConstants.MAC, "")
 bluetoothController = BluetoothController(btAdapter)
 bluetoothController.connect(mac ?: "", this)
 binding.TVillas.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { // Слайдер для руля
 override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
 vt = progress
 binding.Ttext.text = "Тормоз: $vt"
 bluetoothController.sendMessage("vt=${vt};")
 }
 override fun onStartTrackingTouch(seekBar: SeekBar?) {
 }
 override fun onStopTrackingTouch(seekBar: SeekBar?) {
 }
 })
 binding.GVillas.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { // Слайдер для руля
 override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
 gt = progress
 binding.Gtext.text = "Газ: $gt"
 bluetoothController.sendMessage("gt=${gt};")
 }
 override fun onStartTrackingTouch(seekBar: SeekBar?) {
 }
 override fun onStopTrackingTouch(seekBar: SeekBar?) {
 }
 })
 binding.UDVillas.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { // Слайдер для руля
 override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
 ut = progress
 binding.UpDownText.text = "Вверх/Вниз: $ut"
 bluetoothController.sendMessage("ut=${ut};")
 }
 override fun onStartTrackingTouch(seekBar: SeekBar?) {
 }
 override fun onStopTrackingTouch(seekBar: SeekBar?) {
 }
 })
 binding.FTVillas.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { // Слайдер для руля
 override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
 ft = progress
 binding.FromMtoMText.text = "От себя/К себе: $ft"
 bluetoothController.sendMessage("ft=${ft};")
 }
 override fun onStartTrackingTouch(seekBar: SeekBar?) {
 }
 override fun onStopTrackingTouch(seekBar: SeekBar?) {
 }
 })
 }
 companion object {
 fun newInstance(param1: String, param2: String) =
 VillasFragment().apply {
 arguments = Bundle().apply {
 putString(ARG_PARAM1, param1)
 putString(ARG_PARAM2, param2)
 }
 }
 }
 private fun initBtAdapter() {
 val bManager = activity?.getSystemService(Context.BLUETOOTH_SERVICE) as
 BluetoothManager
 btAdapter = bManager.adapter
 }
 override fun onReceive(message: String) {
 }
}

I tried to do the same as in the first activity, but when switching to the second activity, the Bluetooth connection breaks

Ryan M
20.6k35 gold badges76 silver badges85 bronze badges
asked Jan 16, 2024 at 14:21
1
  • Why not create a service inside of a ViewModel that interacts with Bluetooth and have the two activities use it? Commented Jan 16, 2024 at 14:34

1 Answer 1

0

To pass data

val intent = Intent(activity?, activity2::class.java)
intent.putExtra("value name","value want to trasfer")
startActivity(intent) 

To recieve data

var value = getStrinExtra("data")
\\if you transfer an integer use getIntExtra instead of getStringExtra
answered Jan 16, 2024 at 20:19
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.