Карта Google Glass Live не вставляется

Стекло ГДК здесь. Пытаюсь вставить livecard с помощью удаленных просмотров из сервиса. Я запускаю сервис через голосовой вызов. Голосовая команда работает, однако служба не запускается (нет записей в журнале). Сервис находится в манифесте Android. Ниже приведен код:

public class PatientLiveCardService extends Service {

private static final String LIVE_CARD_ID = "timer";


@Override
public void onCreate() {
    Log.warn("oncreate");
    super.onCreate();
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    publishCard(this);

    return START_STICKY;
}

@Override
public void onDestroy() {
    unpublishCard(this);
    super.onDestroy();
}



private void publishCard(Context context) {
    Log.info("inserting live card");
    if (mLiveCard == null) {
        String cardId = "my_card";
        TimelineManager tm = TimelineManager.from(context);
        mLiveCard = tm.getLiveCard(cardId);

        mLiveCard.setViews(new RemoteViews(context.getPackageName(),
                R.layout.activity_vitals));
        Intent intent = new Intent(context, MyActivity.class);
        mLiveCard.setAction(PendingIntent
                .getActivity(context, 0, intent, 0));
        mLiveCard.publish();
    } else {
        // Card is already published.
        return;
    }
}

private void unpublishCard(Context context) {
    if (mLiveCard != null) {
        mLiveCard.unpublish();
        mLiveCard = null;
    }
}

}

Вот AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>

<uses-sdk
    android:minSdkVersion="15"
    android:targetSdkVersion="15" />

<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO" >
</uses-permission>

<application
    android:name="com.myApp"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
      <activity
        android:name="com.myApp.MyActivity"
        android:label="@string/app_name"
        android:screenOrientation="landscape" >
    </activity>

    <service android:name="com.myApp.services.MyService" 
         android:enabled="true"
         android:exported="true">
        <intent-filter>
            <action android:name="com.google.android.glass.action.VOICE_TRIGGER" />
        </intent-filter>

        <meta-data
            android:name="com.google.android.glass.VoiceTrigger"
            android:resource="@xml/voice_trigger_get_patient" />
    </service>

</application>


person Patrick    schedule 20.11.2013    source источник
comment
Где вы объявляете MyActivity? Кроме того, можете ли вы также объявить это в своем манифесте? Поскольку вы не установили режим публикации nonSilent, LiveCard будет публиковаться автоматически, а это означает, что вам нужно будет прокрутить влево от часов, чтобы увидеть его.   -  person Alain    schedule 20.11.2013
comment
Просто добавил MyActivity в манифест. Это было в моем коде, просто я удалил его, чтобы его было легче читать. Я прокрутил влево, и его там нет.   -  person Patrick    schedule 20.11.2013
comment
Видимо проблема с голосовым вводом. Я удалил строку ‹input/› из своего XML-файла voice_trigger, и теперь он работает. То же самое было продублировано с примером таймера, если я добавил строку ‹input/›. Требуется ли другое разрешение?   -  person Patrick    schedule 20.11.2013
comment
Тег ‹input› вместе с атрибутом prompt используется, когда вашему Glassware требуется голосовой ввод перед вызовом, точно так же, как Allthecooks работает, когда вы это делаете: Ok Glass, найдите рецепт для....   -  person Alain    schedule 20.11.2013
comment
Да, я знаю. Это то, что мне нужно. Когда убираю голосовой ввод, лайвкарта вставляется. При вызове голосового ввода карта не вставляется...   -  person Patrick    schedule 20.11.2013
comment
Похоже, вы нашли ошибку: служба не вызывается после голосового ввода. В качестве обходного пути сделайте так, чтобы вашей точкой входа была активность, которая обрабатывает ввод текста, запускает службу и завершает свою работу.   -  person Alain    schedule 20.11.2013
comment
@alain спасибо за быстрый ответ. Должен ли я подать отчет об ошибке? Сделайте это ответом, и я приму его.   -  person Patrick    schedule 20.11.2013


Ответы (1)


Это ошибка XE11: служба не запускается после завершения работы распознавателя речи.

В качестве обходного пути вы можете сделать так, чтобы ваш голосовой триггер запускал Activity, который:

  1. Обрабатывает распознанную речь в onResume.
  2. Как только речь будет обработана, вы начнете Service с startService.
  3. Вызывает finish для перехода к опубликованному LiveCard.
person Alain    schedule 21.11.2013
comment
Будет ли в этом случае вызываться onStartCommand? Для меня onStartCommand вызывается, как я проверял, размещая регистраторы. Но до сих пор Live Card не публикуется. Код выглядит так же, как и выше. Карта просто отображает голосовую команду и никуда от этого не уходит. - person sivag1; 08.12.2013
comment
Пошел вперед и попробовал этот обходной путь. Посредническая деятельность начинается и заканчивается. onStartCommand службы вызывается снова, но карта не публикуется. - person sivag1; 08.12.2013
comment
Вот я снова, я обнаружил, что мои RemoteViews являются нулевыми, что вызывает вышеупомянутые симптомы. Проблема решена сейчас. Спасибо! - person sivag1; 08.12.2013