当USB设备连接且没有堆栈跟踪时,Android 7应用关闭

时间:2018-04-06 16:45:31

标签: android kotlin usb libusb

我通过otg cable使用指纹传感器(Integrated Biometrics)。我在Lollipop设备(API 22)中测试了我的应用程序,一切顺利。但由于我需要测试针对API 24的SourceAFIS library,我在NOUGAT设备中进行了测试。在请求设备权限后,应用程序崩溃但没有我能够真正理解的错误消息:

A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xc in tid 8384 (d.scannersample)

我在运行时尝试了权限请求无济于事。在调试时,代码达到了执行刚刚停止的程度,在logcat中没有错误。

完整Logcat:

com.android.scannersample I/OpenGLRenderer: Initialized EGL, version 1.4
com.android.scannersample D/OpenGLRenderer: Swap behavior 1
com.android.scannersample D/UsbDeviceConnectionJNI: close
com.android.scannersample D/IBSCAN: 0-Enter GetDeviceCount ()
com.android.scannersample D/IBSCAN: 0-Exit  GetDeviceCount (pDeviceCount=1)      
0-Enter GetDeviceDescription (deviceIndex=0)
com.android.scannersample D/UsbDeviceConnectionJNI: close
com.android.scannersample W/d.scannersample: type=1400 audit(0.0:5434): avc: denied { read } for uid=10238 name="devices" dev="sysfs" ino=16624 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:sysfs:s0 tclass=dir permissive=0
com.android.scannersample A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xc in tid 9547 (d.scannersample)

应用详情:

  • 应用程序包含一个状态机,根据收到的回调,它会更新UI以启用/禁用按钮。
  • 应用程序可以通过电子邮件发送生成的图像(以png格式)。我没有找到工作所需的权限,但如果有人知道更好,请通知。
  • 应用程序保存从传感器生成的图像,因此执行权限请求
  • 由于使用了USB," android.hardware.usb.host"功能在清单中声明。在Lollipop设备中,应用信息屏幕中列出的唯一权限是"修改或删除USB存储设备的内容"和"读取USB存储器的内容"
  • 我使用libusb库和armeabi中的预构建.so文件以及jniLibs目录中的armeabi-v7a文件夹。我放弃了兼容性问题,因为调试设备权限请求显示为已授予,但如果有人知道更好,我会接受任何建议。

我尝试的事情:

  • 根据this thread
  • 中的建议停用硬件加速
  • 在运行时请求外部存储(读取,写入)权限
  • 调试以查看是否存在可能影响执行的任何空值或程序错误
  • 在Manifest和运行时请求中添加添加权限

代码(Kotlin):

val usbManager = this.applicationContext.getSystemService(Context.USB_SERVICE) as UsbManager
    val deviceList : HashMap<String, UsbDevice> = usbManager.deviceList
    val deviceIterator : Iterator<UsbDevice> = deviceList.values.iterator()
    while (deviceIterator.hasNext()) {
        val device : UsbDevice = deviceIterator.next()
        val isScanDevice : Boolean = IBScan.isScanDevice(device)
        if (isScanDevice) {
            if (!usbManager.hasPermission(device)) {
                mIbScan.requestPermission(device.deviceId)
            } else {
                Log.d(TAG, "Device permission granted")
            }
        }
    }

    try {
        if (mIbScan.deviceCount > 0) {
            try {
                val deviceDesc : IBScan.DeviceDesc = this.mIbScan.getDeviceDescription(INITIALIZING_DEVICE_INDEX)
                transitionToScannerAttached(deviceDesc.productName + " " + deviceDesc.serialNumber, mIbScan.deviceCount)
            } catch (scanExc : ScanException) {
                Log.d(TAG, "Received exception getting device description " + scanExc.getType().toString());
                transitionToNoScannerAttached();
            }
        } else {
            transitionToNoScannerAttached()
        }
    } catch (scanExc : ScanException) {
        Log.d(TAG, "Received exception getting device count " + scanExc.getType().toString());
        transitionToNoScannerAttached();
    }

到目前为止,我还没有找到它为什么在棒棒糖而不是在牛轧糖中工作。提前感谢您的建议和见解

0 个答案:

没有答案