Не удается отправить данные на USB-устройство, подключенное к Android Device Host после сна - PullRequest
0 голосов
/ 04 июля 2018

У меня есть следующие настройки:

Планшет: Panasonic FZ-A2

Подключено к обычному порту USB 2.0: Термопринтер

Планшет также имеет дополнительный разъем USB типа C.

Когда принтер подключен, печать работает, мы можем отправлять данные на принтер и получать данные с него.

После нажатия кнопки питания на устройстве экран выключается, и при повторном нажатии устройство начинает работать, но отправка данных на принтер больше не работает .

Единственный способ возобновить работу принтера - отключить / снова подключить USB-кабель или кабель питания или перезагрузить планшет.

Список устройств, открытие UsbDeviceConnection, утверждение интерфейса и операция записи выполняются каждый раз отдельно, и повторного использования нет.

Я уверен, что мы используем правильные конечные точки с правильным направлением данных.

Кроме того, когда включена отладка USB и кабель, подключенный к другому USB-порту типа C, подключенному к планшету, проблема не проявляется, вероятно, потому, что отладочное соединение ADB на USB-порту C продолжает пробуждать обычный USB-порт, где принтер подключен как побочный эффект.

Также, когда планшет работает от батареи, проблема вообще не проявляется.

Редактировать 1:

После реализации фоновой службы, которая получает частичную блокировку пробуждения от Power Manager, проблема больше не воспроизводится.

Это предотвращает переход устройства в спящий режим даже при нажатии кнопки питания.

Тем не менее основная проблема все еще присутствует. Если приложение убито, проблему можно воспроизвести.

1 Ответ

0 голосов
/ 19 июля 2018

Не удалось найти реальное решение этой проблемы, но был найден обходной путь путем получения частичной блокировки пробуждения и никогда не отпускать ее. Это предотвращает переход 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...