睡眠后无法向连接到Android设备主机的USB设备发送数据
我有以下设置: 平板电脑:松下FZ-A2 在常规USB 2.0端口上连接:热敏打印机 平板电脑还有一个额外的USB C型接口 连接打印机后,打印工作正常,我们可以向打印机发送数据并从打印机接收数据 按下设备上的电源按钮后,屏幕将关闭,再次按下时,设备将唤醒,但向打印机发送数据不再工作 使打印机重新工作的唯一方法是拔下/重新插入USB电缆或电源线,或重新启动平板电脑 设备列表、打开UsbDeviceConnection、声明接口和写入操作每次都是单独完成的,没有重复使用 我确信我们使用的是正确的端点和正确的数据方向 此外,如果启用USB调试,并且平板电脑上的另一个USB Type C端口上连接了电缆,则问题可能不会出现,因为USB C端口上的ADB调试连接将唤醒打印机连接的常规USB端口,这是一种副作用 此外,当平板电脑使用电池运行时,问题根本不会出现 编辑1: 在实现从电源管理器获取部分唤醒锁的后台服务后,问题不再重现 这样即使按下电源按钮,设备也不会进入睡眠模式 但根本问题仍然存在。睡眠后无法向连接到Android设备主机的USB设备发送数据,android,printing,usb,Android,Printing,Usb,我有以下设置: 平板电脑:松下FZ-A2 在常规USB 2.0端口上连接:热敏打印机 平板电脑还有一个额外的USB C型接口 连接打印机后,打印工作正常,我们可以向打印机发送数据并从打印机接收数据 按下设备上的电源按钮后,屏幕将关闭,再次按下时,设备将唤醒,但向打印机发送数据不再工作 使打印机重新工作的唯一方法是拔下/重新插入USB电缆或电源线,或重新启动平板电脑 设备列表、打开UsbDeviceConnection、声明接口和写入操作每次都是单独完成的,没有重复使用 我确信我们使用的是正确的端
如果应用程序被终止,问题仍然可以重现。无法找到此问题的真正解决方案,但可以通过获取部分唤醒锁并永不释放来解决此问题。 这可防止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));
}