2014-07-10 4 views
-1

Я хочу создать простое приложение, которое работает в фоновом режиме с помощью службы.Используйте Recognizer для открытия приложений

Используя SpeechRecognizer, он будет прослушивать имена приложений, и когда он найдет существующий, он откроет его. Также, если он не находит совпадения или результат не ясен, он предлагает некоторые варианты, показывающие их в списке или голосом.

Я уже знаю, как использовать SpeechRecognizer, но мне нужно установить эту службу, чтобы поддерживать работу на фоне и не убивать ее. Это можно сделать?

+1

Итак, если вы знаете, как работает SpeechRecognizer, что вам действительно нужно? Как вы что-то пробовали? – masmic

+0

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

+0

Ну, тогда вы должны подумать, что вы не выполняете конкретный вопрос, который мы могли бы решить, поскольку вы запрашиваете информацию о разных темах. Если у вас есть конкретный вопрос, отредактируйте свой вопрос, в противном случае вы должны начать читать сайт разработчиков Android, где у вас есть несколько руководств об этих вещах. Https://developer.android.com/training/index.html – masmic

ответ

0

Как я уже говорил, я считаю, что вам не нужно использовать широковещательный приемник для того, что вы пытаетесь сделать. Вместо этого вы должны определить службу для непрерывного прослушивания речи. Вы можете найти реализацию here:

И для этого о службах убийства в андроидах вы не можете запретить службе убивать систему, даже системные службы могут быть убиты.

Во всяком случае, вы можете использовать startForeground() метод сервиса:

по услугам по умолчанию является фоном, а это означает, что если система нуждается в , чтобы убить их, чтобы вернуть больше памяти (например, для отображения большой страницы в веб-браузер), их можно убить без особого вреда. Вы можете установить , если ваш сервис будет нарушен для пользователя, , например, если ваша служба выполняет фоновое воспроизведение музыки, поэтому пользователь заметил бы, что их музыка перестала играть.

Вы можете увидеть реализацию here.

1

В дополнение ко всему этому, я хотел бы добавить по крайней мере, этот пункт:

SpeechRecognizer лучше для громкой пользовательских интерфейсов, так как ваше приложение получает на самом деле реагировать на ошибки условия, такие как «Нет совпадений» и, возможно, перезагрузите себя. Когда вы используете Intent, приложение подает звуковой сигнал и показывает диалог, который пользователь должен нажать, чтобы продолжить.

Мое резюме выглядит следующим образом:

SpeechRecognizer

  • Показать другое интерфейс или нет интерфейса вообще. Вы действительно хотите, чтобы пользовательский интерфейс вашего приложения подавал звуковой сигнал? Вы действительно хотите, чтобы ваш пользовательский интерфейс отображал диалог, когда есть ошибка, и ждать, пока пользователь нажмет?

  • App может сделать что-то еще в то время как распознавание речи происходит

  • Может распознавать речь во время работы в фоновом режиме или от службы

  • может обрабатывать ошибки лучше

  • получить доступ низкого уровня речевой материал, такой как исходный звук или RMS.Проанализируйте, что звук или использовать громкость, чтобы сделать какой-то мигания света, чтобы указать приложение прослушивает

Намерение

  • Последовательная и простой в использовании интерфейс для пользователей
  • Простота программирования

Это работа для версии 4.1.1 для Android.

public class MyService extends Service 
{ 
    protected AudioManager mAudioManager; 
    protected SpeechRecognizer mSpeechRecognizer; 
    protected Intent mSpeechRecognizerIntent; 
    protected final Messenger mServerMessenger = new Messenger(new IncomingHandler(this)); 

    protected boolean mIsListening; 
    protected volatile boolean mIsCountDownOn; 
    private boolean mIsStreamSolo; 

    static final int MSG_RECOGNIZER_START_LISTENING = 1; 
    static final int MSG_RECOGNIZER_CANCEL = 2; 

    @Override 
    public void onCreate() 
    { 
     super.onCreate(); 
     mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this); 
     mSpeechRecognizer.setRecognitionListener(new SpeechRecognitionListener()); 
     mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
             RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
     mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, 
             this.getPackageName()); 
    } 

    protected static class IncomingHandler extends Handler 
    { 
     private WeakReference<MyService> mtarget; 

     IncomingHandler(MyService target) 
     { 
      mtarget = new WeakReference<MyService>(target); 
     } 


     @Override 
     public void handleMessage(Message msg) 
     { 
      final MyService target = mtarget.get(); 

      switch (msg.what) 
      { 
       case MSG_RECOGNIZER_START_LISTENING: 

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) 
        { 
         // turn off beep sound 
         if (!mIsStreamSolo) 
         { 
          mAudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true); 
          mIsStreamSolo = true; 
         } 
        } 
        if (!target.mIsListening) 
        { 
         target.mSpeechRecognizer.startListening(target.mSpeechRecognizerIntent); 
         target.mIsListening = true; 
         //Log.d(TAG, "message start listening"); //$NON-NLS-1$ 
        } 
        break; 

       case MSG_RECOGNIZER_CANCEL: 
        if (mIsStreamSolo) 
        { 
         mAudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, false); 
         mIsStreamSolo = false; 
        } 
         target.mSpeechRecognizer.cancel(); 
         target.mIsListening = false; 
         //Log.d(TAG, "message canceled recognizer"); //$NON-NLS-1$ 
         break; 
      } 
     } 
    } 

    // Count down timer for Jelly Bean work around 
    protected CountDownTimer mNoSpeechCountDown = new CountDownTimer(5000, 5000) 
    { 

     @Override 
     public void onTick(long millisUntilFinished) 
     { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onFinish() 
     { 
      mIsCountDownOn = false; 
      Message message = Message.obtain(null, MSG_RECOGNIZER_CANCEL); 
      try 
      { 
       mServerMessenger.send(message); 
       message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING); 
       mServerMessenger.send(message); 
      } 
      catch (RemoteException e) 
      { 

      } 
     } 
    }; 

    @Override 
    public void onDestroy() 
    { 
     super.onDestroy(); 

     if (mIsCountDownOn) 
     { 
      mNoSpeechCountDown.cancel(); 
     } 
     if (mSpeechRecognizer != null) 
     { 
      mSpeechRecognizer.destroy(); 
     } 
    } 

    protected class SpeechRecognitionListener implements RecognitionListener 
    { 

     @Override 
     public void onBeginningOfSpeech() 
     { 
      // speech input will be processed, so there is no need for count down anymore 
      if (mIsCountDownOn) 
      { 
       mIsCountDownOn = false; 
       mNoSpeechCountDown.cancel(); 
      }    
      //Log.d(TAG, "onBeginingOfSpeech"); //$NON-NLS-1$ 
     } 

     @Override 
     public void onBufferReceived(byte[] buffer) 
     { 

     } 

     @Override 
     public void onEndOfSpeech() 
     { 
      //Log.d(TAG, "onEndOfSpeech"); //$NON-NLS-1$ 
     } 

     @Override 
     public void onError(int error) 
     { 
      if (mIsCountDownOn) 
      { 
       mIsCountDownOn = false; 
       mNoSpeechCountDown.cancel(); 
      } 
      mIsListening = false; 
      Message message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING); 
      try 
      { 
        mServerMessenger.send(message); 
      } 
      catch (RemoteException e) 
      { 

      } 
      //Log.d(TAG, "error = " + error); //$NON-NLS-1$ 
     } 

     @Override 
     public void onEvent(int eventType, Bundle params) 
     { 

     } 

     @Override 
     public void onPartialResults(Bundle partialResults) 
     { 

     } 

     @Override 
     public void onReadyForSpeech(Bundle params) 
     { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) 
      { 
       mIsCountDownOn = true; 
       mNoSpeechCountDown.start(); 

      } 
      Log.d(TAG, "onReadyForSpeech"); //$NON-NLS-1$ 
     } 

     @Override 
     public void onResults(Bundle results) 
     { 
      //Log.d(TAG, "onResults"); //$NON-NLS-1$ 

     } 

     @Override 
     public void onRmsChanged(float rmsdB) 
     { 

     } 

    } 
} 
+0

«Намерение», используя способ сделать это, показывает окно на экране и запрашивает ввод пользователя, поэтому, если он хочет, чтобы этот процесс был автоматизирован, он должен использовать SpeechRecognizer. Также вы должны указать, что обходной путь (вы должны связать исходный пост, как я сделал) для SpeechRecognizer – masmic

+0

@masmic, см. Это http://www.codeproject.com/Articles/689451/Developing-Android-Applications- with-Voice-Recogni – Laxmeena

+0

Да, я прочитал несколько таких уроков. Несколько месяцев назад я разрабатывал приложение, в котором я интегрировал распознавание голоса. Я начал с режима «намерения», но таким образом он не справляется с ошибками, поэтому пользователю требуется несколько раз. Наконец, мне пришлось реализовать SpeechRecognition, так как это единственный способ в этот момент сделать так, чтобы это было автоматизировано, так как оно управляет ошибками, а пользовательский ввод не нужен. – masmic

Смежные вопросы