睡眠后无法将数据发送到连接到 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));
}
我有以下设置:
平板电脑:松下 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));
}