我有以下设置:
平板电脑:松下FZ-A2
通过常规USB 2.0端口连接:热敏打印机
平板电脑还具有一个额外的USB C型接口。
连接打印机后,打印即可进行,我们可以将数据发送到打印机并从中接收数据。
按下设备上的电源按钮后,屏幕将关闭,再次按下时设备将唤醒,但无法再将数据发送至打印机。
使打印机重新工作的唯一方法是拔下/重新插入USB电缆或电源线,或重新启动平板电脑。
设备列表,打开UsbDeviceConnection,声明接口和写入操作都是分别进行的,并且不会重复使用。
我确定我们使用的是正确的端点和正确的数据方向。
此外,当启用USB调试并在平板电脑上的另一个USB C型端口上连接了电缆时,该问题可能不会显现,这可能是因为USB C端口上的ADB调试连接不断唤醒常规USB端口,打印机被连接为副作用。
此外,当平板电脑使用电池供电时,该问题根本不会显现。
编辑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));
}