Android не запрашивает разрешение на последовательную USB-связь или не регистрирует ответAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android не запрашивает разрешение на последовательную USB-связь или не регистрирует ответ

Сообщение Anonymous »

Я создаю простое приложение для Android, которое подключается к Arduino с датчиком веса. На Android 11 это работает, но я тестирую на Android 14, и это либо:
Не запрашивать разрешение USB и автоматически отклонять его
или Запрашивать его, и даже если я говорю «да», он все равно отклоняет это .
Я не новичок в программировании, но определенно новичок в Kotling и долгое время не программировал.
Вот что я сделал:
Вот что я сделал:
p>
  • Я уверен, что устройство, на котором я запускаю приложение, совместимо с OTG
  • Я уверен, что устройство может обмениваться данными с Arduino, я использовал приложение «Последовательный USB-терминал» и могу подключаться к Arduino и обмениваться данными с устройством, а также получать данные о весе датчика и все такое, поэтому связь возможна.
    2.1. Это приложение запрашивает то же разрешение, которое мне нужно, но, вероятно, обрабатывает его правильно, в отличие от меня.
Вот класс, который обрабатывает USB-связь.
```class IOPesa(private val context: Context) {
private var serialPort: UsbSerialDevice? = null
private var responseData: String? = null
private val usbManager: UsbManager = context.getSystemService(Context.USB_SERVICE) as UsbManager
private val responseLatch = CountDownLatch(1)

companion object {
private const val ACTION_USB_PERMISSION = "com.example.testapp.USB_PERMISSION"
private const val TAG = "IOPesa"
}

private val usbPermissionReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
synchronized(this) {
if (ACTION_USB_PERMISSION == intent.action) {
val device: UsbDevice? = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE)
Log.d(TAG, "Broadcast received. Device: $device")
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false) && device != null) {
Log.d(TAG, "Permission granted for device: ${device.deviceName}")
connectToDevice(device)
} else {
Log.e(TAG, "Permission denied for the device ${device?.deviceName}")
}
}
}
}
}

init {
val filter = IntentFilter(ACTION_USB_PERMISSION)
context.registerReceiver(usbPermissionReceiver, filter, Context.RECEIVER_EXPORTED)
discoverDeviceAndRequestPermission()
}

private fun discoverDeviceAndRequestPermission() {
val deviceList = usbManager.deviceList
val device = deviceList.values.firstOrNull()
if (device != null) {
Log.d(TAG, "Device found: ${device.deviceName}, requesting permission...")
requestPermission(device)
} else {
Log.e(TAG, "No USB devices connected.")
}
}

private fun requestPermission(device: UsbDevice) {
Log.d(TAG, "Requesting permission for device: ${device.deviceName}")
val permissionIntent = PendingIntent.getBroadcast(context, 0, Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
usbManager.requestPermission(device, permissionIntent)
Log.d(TAG, "Permission intent sent. Device: $device, PermissionIntent: $permissionIntent")
}

private fun connectToDevice(device: UsbDevice) {
val connection = usbManager.openDevice(device)
serialPort = UsbSerialDevice.createUsbSerialDevice(device, connection)
if (serialPort != null && serialPort!!.open()) {
Log.d(TAG, "Connection opened, configuring serial port...")
configureSerialConnection()
} else {
Log.e(TAG, "Could not open the device connection or create serial device.")
}
}

private fun configureSerialConnection() {
serialPort?.apply {
setBaudRate(9600)
setDataBits(UsbSerialInterface.DATA_BITS_8)
setStopBits(UsbSerialInterface.STOP_BITS_1)
setParity(UsbSerialInterface.PARITY_NONE)
setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF)
read { data ->
responseData = String(data)
Log.d(TAG, "Received data: $responseData")
responseLatch.countDown()
}
}
Log.d(TAG, "Serial port configured.")
}

fun enviar(message: String): String {
Log.d(TAG, "Sending message: $message")

responseData = null // Resetear los datos antes de enviar
responseLatch.await(0, TimeUnit.SECONDS) // Restablecer el latch

serialPort?.write(message.toByteArray())

responseLatch.await(2, TimeUnit.SECONDS) // Esperar hasta 2 segundos para la respuesta

return responseData ?: "No response received"
}

fun disconnect() {
serialPort?.close()
context.unregisterReceiver(usbPermissionReceiver)
Log.d(TAG, "Disconnected and receiver unregistered.")
}
}```

вот мой манифест:



















```

And here are the logcat outputs I marked "confusing"

**Device found:**
2024-06-22 23:49:05.360 30020-30020 IOPesa com.example.testapp D Device found: /dev/bus/usb/001/002, requesting permission...

**Requesting permision**
2024-06-22 23:49:05.360 30020-30020 IOPesa com.example.testapp D Requesting permission for device: /dev/bus/usb/001/002

**Request sent**
2024-06-22 23:49:05.377 30020-30020 IOPesa com.example.testapp D Permission intent sent. Device: UsbDevice[mName=/dev/bus/usb/001/002,mVendorId=6790,mProductId=29987,mClass=255,mSubclass=0,mProtocol=0,mManufacturerName=null,mProductName=USB Serial,mVersion=2.64,mSerialNumberReader=android.hardware.usb.IUsbSerialReader$Stub$Proxy@7e3e8bc, mHasAudioPlayback=false, mHasAudioCapture=false, mHasMidi=false, mHasVideoCapture=false, mHasVideoPlayback=false, mConfigurations=[
UsbConfiguration[mId=1,mName=null,mAttributes=128,mMaxPower=49,mInterfaces=[
UsbInterface[mId=0,mAlternateSetting=0,mName=null,mClass=255,mSubclass=1,mProtocol=2,mEndpoints=[
UsbEndpoint[mAddress=130,mAttributes=2,mMaxPacketSize=32,mInterval=0]
UsbEndpoint[mAddress=2,mAttributes=2,mMaxPacketSize=32,mInterval=0]
UsbEndpoint[mAddress=129,mAttributes=3,mMaxPacketSize=8,mInterval=1]]]], PermissionIntent: PendingIntent{a5b9045: android.os.BinderProxy@94fa39a}

**Permission Denied** Weather it prompts for it and I say yes or not prompt for it, that is the response I get.

2024-06-22 23:49:07.736 30020-30020 IOPesa com.example.testapp E Permission denied for the device null


Подробнее здесь: https://stackoverflow.com/questions/786 ... ng-the-ans
Ответить

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

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

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

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

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