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

时间:2018-07-04 07:59:05

标签: android printing usb

我有以下设置:

平板电脑:松下FZ-A2

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

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

连接打印机后,打印即可进行,我们可以将数据发送到打印机并从中接收数据。

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

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

设备列表,打开UsbDeviceConnection,声明接口和写入操作都是分别进行的,并且不会重复使用。

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

此外,当启用USB调试并在平板电脑上的另一个USB C型端口上连接了电缆时,该问题可能不会显现,这可能是因为USB C端口上的ADB调试连接不断唤醒常规USB端口,打印机被连接为副作用。

此外,当平板电脑使用电池供电时,该问题根本不会显现。

编辑1:

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

即使按下电源按钮,这也可以防止设备进入睡眠模式。

仍然存在潜在的问题。 如果该应用被终止,该问题仍然可以重现。

1 个答案:

答案 0 :(得分:0)

无法找到此问题的真正解决方案,而是通过获取部分唤醒锁并从不释放它的解决方法。 这样可以防止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));
}