睡眠后无法将数据发送到连接到 Android 设备主机的 USB 设备

Can not send data to USB Device connected to Android Device Host after sleep

我有以下设置:

平板电脑:松下 FZ-A2

连接到常规 USB 2.0 端口:热敏打印机

平板电脑还有一个额外的 USB C 型连接器。

连接好打印机后,打印正常,我们可以向打印机发送数据,也可以从打印机接收数据。

按下设备上的电源按钮后屏幕关闭,当再次按下时设备被唤醒但无法再向打印机发送数据.

使打印机重新工作的唯一方法是 unplug/replug USB 电缆或电源线或重新启动平板电脑。

设备列表、打开UsbDeviceConnection、声明接口和写入操作每次都是单独完成的,没有重复使用。

我确信我们使用的是具有正确数据方向的正确端点。

此外,当启用 USB 调试并且将电缆连接到平板电脑上连接的另一个 USB Type C 端口时,问题没有出现可能是因为 USB C 端口上的 ADB 调试连接一直唤醒常规 USB 端口作为副作用连接打印机的地方。

此外,当平板电脑 运行 使用电池时,问题根本不会出现。

编辑 1:

实施从电源管理器获取部分唤醒锁的后台服务后,问题不再重现。

这可以防止设备在按下电源按钮时进入睡眠模式。

仍然存在潜在问题。 如果应用被杀死,问题仍然可以重现。

无法找到真正解决此问题的方法,但可以通过获取部分唤醒锁并从不释放它来找到解决方法。 这可以防止 USB 主机进入睡眠模式。 请注意,唤醒锁需要在后台服务中获取,如果在 Application.create().

上完成则无法正常工作
public class WakeLockService extends Service {

  public static final int NOTIFICATION_ID = 1337;

  private final transient Logger logger = LoggerFactory.getLogger(WakeLockService.class);

  private void start(int paramInt) {
    logger.info("Wake lock service starting");

    // acquire wake lock
    WakeLocker.acquire(this);

    NotificationCompat.Builder localBuilder;

    Intent intent = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

    localBuilder = new NotificationCompat.Builder(this);
    localBuilder.setContentTitle("Wake lock");
    localBuilder.setContentIntent(pendingIntent);
    localBuilder.setSmallIcon(R.drawable.ic_power_settings_new_gray_48dp);
    localBuilder.setWhen(System.currentTimeMillis());
    localBuilder.setOngoing(true);
    startForeground(NOTIFICATION_ID, localBuilder.build());
  }

  private void stop() {
    WakeLocker.release();
    Toast.makeText(this, "Wake lock stopped", Toast.LENGTH_LONG).show();
    stopForeground(true);
  }

  public IBinder onBind(Intent paramIntent) {
    return null;
  }

  public void onDestroy() {
    stop();
  }

  public int onStartCommand(Intent paramIntent, int paramInt1, int paramInt2) {
    start(0);
    return Service.START_NOT_STICKY;
  }
}

服务启动于 App.onCreate():

public void onCreate() {
    super.onCreate();

    // start wake lock
    startService(new Intent(this, WakeLockService.class));
}