UsbManager在28版本下的改动

解决Android USB Camera权限问题

用UsbManager来识别外置的camera设备,授权打开的功能。

授权功能

    //申请USB连接权限
    private synchronized void requestPermission(UsbDevice device) {
        //申请USB连接权限
        mPermissionIntent = PendingIntent.getBroadcast(appContext, 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_UPDATE_CURRENT);
        mUsbManager.requestPermission(device, mPermissionIntent);

    }

之前一直使用的是SDK27的版本,授权都是没有问题,弹出授权框授权,当我兼容了androidx升级到了28之后,授权框就一直不弹出。

 

查看日志,发现在授权的时候,会有一句这样的打印

UsbUserSettingsManager: Camera permission required for USB video class devices

 

原因是应该28之后,需要动态申请camera权限才可以授权弹框。

解决办法,要不版本到27及以下,要么先授权camera。

package com.example.test; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import android.Manifest; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import android.os.Bundle; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.hoho.android.usbserial.driver.UsbSerialDriver; import com.hoho.android.usbserial.driver.UsbSerialPort; import com.hoho.android.usbserial.driver.UsbSerialProber; import com.hoho.android.usbserial.util.SerialInputOutputManager; import java.util.List; public class MainActivity extends AppCompatActivity { private TextView serialNameTextView; private Button openSerialButton; private UsbSerialPort serialPort; private static final String ACTION_USB_PERMISSION = "com.example.serialtest.USB_PERMISSION"; private final BroadcastReceiver usbReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { // 使用标准的 Android USB 权限处理方式 UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); boolean granted = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false); if (granted && device != null) { // 获取驱动并打开串口 List<UsbSerialDriver> drivers = UsbSerialProber.getDefaultProber().findAllDrivers(getSystemService(USB_SERVICE)); for (UsbSerialDriver driver : drivers) { if (driver.getDevice().equals(device)) { openSerialPort(driver.getPorts().get(0)); break; } } } else { Toast.makeText(context, "权限被拒绝", Toast.LENGTH_SHORT).show(); } } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); serialNameTextView = findViewById(R.id.SerialName); openSerialButton = findViewById(R.id.OpenSerial); openSerialButton.setOnClickListener(v -> findAndOpenSerialPort()); registerReceiver(usbReceiver, new IntentFilter(ACTION_USB_PERMISSION)); } private void findAndOpenSerialPort() { List<UsbSerialDriver> drivers = UsbSerialProber.getDefaultProber().findAllDrivers(getSystemService(USB_SERVICE)); if (drivers.isEmpty()) { Toast.makeText(this, "未检测到串口设备", Toast.LENGTH_SHORT).show(); return; } UsbSerialDriver driver = drivers.get(0); UsbSerialPort port = driver.getPorts().get(0); // 获取第一个端口 PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_IMMUTABLE); android.hardware.usb.UsbManager usbManager = getSystemService(android.hardware.usb.UsbManager.class); if (usbManager.hasPermission(driver.getDevice())) { openSerialPort(port); } else { usbManager.requestPermission(driver.getDevice(), permissionIntent); } } private void openSerialPort(UsbSerialPort port) { try { port.open(getSystemService(UsbManager.class).openDevice(port.getDriver().getDevice())); port.setParameters(9600, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE); serialPort = port; serialNameTextView.setText(port.getDriver().getDevice().getDeviceName()); } catch (Exception e) { Toast.makeText(this, "无法打开串口: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } } @Override protected void onDestroy() { super.onDestroy(); if (serialPort != null) { try { serialPort.close(); } catch (Exception ignored) {} } unregisterReceiver(usbReceiver); } } 在BroadcastReceiver中的List<UsbSerialDriver> drivers = UsbSerialProber.getDefaultProber().findAllDrivers(getSystemService(USB_SERVICE));出现问题Required type:UsbManager Provided:Object,在onCreate中的registerReceiver(usbReceiver, new IntentFilter(ACTION_USB_PERMISSION));出现问题:usbReceiver is missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag for unprotected broadcasts registered for com.example.serialtest.,在findAndOpenSerialPort中的List<UsbSerialDriver> drivers = UsbSerialProber.getDefaultProber().findAllDrivers(getSystemService(USB_SERVICE));中出现问题:Required type:UsbManager Provided:Object
08-01
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值