Печать службы Bluetooth с использованием сопрограммAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Печать службы Bluetooth с использованием сопрограмм

Сообщение Anonymous »

Я работаю над проектом представлений Android со следующими функциями:
  • одно действие и несколько фрагментов,
  • используя сопрограммы Kotlin,
  • которые переводятся в Compose
Мне нужно подключиться к Bluetooth-принтеру, держите соединение открытым, когда приложение находится на переднем плане, запускайте печать, когда она нужна пользователю, и отключайтесь, когда приложение не активно.
По-видимому, в Интернете нет руководств по этому вопросу. это простая задача, поэтому я говорю здесь, начиная с моего кода, который каким-то образом работает, но не лучшим образом.
В методе onCreate основного действия я запускаю сопрограмма, которая ищет спаренные принтеры и подключает один из них:

Код: Выделить всё

class MainActivity : AppCompatActivity() {
private var bluetoothAdapter: BluetoothAdapter? = null
private var pairedPrinters: List? = null
var mmSocket: BluetoothSocket? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val deviceAddress: String = [chosen device address]
lifecycleScope.launch (Dispatchers.IO) {
// check permissions
pairedPrinters = bluetoothAdapter?.bondedDevices
mmSocket = pairedPrinters?.find { it.address == deviceAddress }?.createRfcommSocketToServiceRecord(Constants.APP_BT_UUID)
}
bluetoothAdapter?.cancelDiscovery()
mmSocket?.let {socket ->
try {
socket.connect()
} catch { [handle exceptions] }
}
}
repeatOnLifecycle(Lifecycle.State.DESTROYED) {
launch (Dispatchers.IO) {
mmSocket?.let {socket ->
try {
socket.close()
} catch (e : IOException) {
Log.e(LOG_TAG, "Couldn't close BT socket")
}
}
}
}
}
}
Затем в своих фрагментах я использую mmSocket mainActivity

Код: Выделить всё

class CheckoutFragment : Fragment() {
private fun printReceipt() {
viewLifecycleOwner.lifecycleScope.launch (Dispatchers.IO) {
(activity as MainActivity).mmSocket?.let { socket ->
try {
socket.outputStream.write([ my byte array ])
} catch { [handle exceptions] }
}
}
}
}
Как написано выше, это «как-то» работает. Однако
  • иногда я перехватываю исключения тайм-аута соединения через сокет Bluetooth.
И< /p>
  • Я не уверен, что этот код является потокобезопасным, так как в официальном руководстве по Android я вижу эту инициализацию BluetoothSocket, которой я и являюсь. не могу реализовать в своей деятельности (мое невежество: я отделяю декларацию от назначения и не могу скомпилировать следующее):
    private val mmSocket: BluetoothSocket? от lazy(LazyThreadSafetyMode.NONE) {
    device.createRfcommSocketToServiceRecord(MY_UUID)
    }


Подробнее здесь: https://stackoverflow.com/questions/790 ... coroutines
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»