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

睡眠后无法向连接到Android设备主机的USB设备发送数据,android,printing,usb,Android,Printing,Usb,我有以下设置: 平板电脑:松下FZ-A2 在常规USB 2.0端口上连接:热敏打印机 平板电脑还有一个额外的USB C型接口 连接打印机后,打印工作正常,我们可以向打印机发送数据并从打印机接收数据 按下设备上的电源按钮后,屏幕将关闭,再次按下时,设备将唤醒,但向打印机发送数据不再工作 使打印机重新工作的唯一方法是拔下/重新插入USB电缆或电源线,或重新启动平板电脑 设备列表、打开UsbDeviceConnection、声明接口和写入操作每次都是单独完成的,没有重复使用 我确信我们使用的是正确的端

我有以下设置:

平板电脑:松下FZ-A2

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

平板电脑还有一个额外的USB C型接口

连接打印机后,打印工作正常,我们可以向打印机发送数据并从打印机接收数据

按下设备上的电源按钮后,屏幕将关闭,再次按下时,设备将唤醒,但向打印机发送数据不再工作

使打印机重新工作的唯一方法是拔下/重新插入USB电缆或电源线,或重新启动平板电脑

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

我确信我们使用的是正确的端点和正确的数据方向

此外,如果启用USB调试,并且平板电脑上的另一个USB Type C端口上连接了电缆,则问题可能不会出现,因为USB C端口上的ADB调试连接将唤醒打印机连接的常规USB端口,这是一种副作用

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

编辑1:

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

这样即使按下电源按钮,设备也不会进入睡眠模式

但根本问题仍然存在。
如果应用程序被终止,问题仍然可以重现。

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

服务已在App.onCreate()上启动:

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;
  }
}
public void onCreate() {
    super.onCreate();

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