Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用语音识别器打开应用程序_Android_Service_Speech Recognition - Fatal编程技术网

Android 使用语音识别器打开应用程序

Android 使用语音识别器打开应用程序,android,service,speech-recognition,Android,Service,Speech Recognition,我想创建一个简单的应用程序,使用服务在后台运行 使用SpeechRecognizer它将侦听应用程序名称,当找到现有名称时,它将打开它。此外,如果没有发现巧合或结果不清楚,它会建议一些选项,在列表中或通过语音显示它们 我已经知道如何使用SpeechRecognizer,但我需要的是将此服务设置为在后台保持运行,并避免它被杀死。这可以做到吗?正如评论所说,我认为您不需要使用广播接收器来完成您试图做的事情。相反,您应该将服务定义为持续监听语音。您可以找到一个实现: 关于android杀戮服务,你不能

我想创建一个简单的应用程序,使用服务在后台运行

使用
SpeechRecognizer
它将侦听应用程序名称,当找到现有名称时,它将打开它。此外,如果没有发现巧合或结果不清楚,它会建议一些选项,在列表中或通过语音显示它们


我已经知道如何使用
SpeechRecognizer
,但我需要的是将此服务设置为在后台保持运行,并避免它被杀死。这可以做到吗?

正如评论所说,我认为您不需要使用广播接收器来完成您试图做的事情。相反,您应该将服务定义为持续监听语音。您可以找到一个实现:

关于android杀戮服务,你不能阻止服务被系统杀戮,甚至系统服务也可以被杀戮

无论如何,您可以使用服务的
startForeground()
方法:

默认情况下,服务是后台服务,这意味着如果系统需要 杀死它们以回收更多内存(例如显示一个大页面 在网络浏览器中),它们可以被杀死而不会造成太大伤害。你可以 如果终止服务会中断用户,请设置此标志, 例如,如果您的服务正在播放背景音乐 用户会注意到他们的音乐是否停止播放


您可以看到实现。

除此之外,我至少要补充一点:

SpeechRecognitor更适用于免提用户界面,因为您的应用程序实际上可以响应“不匹配”等错误条件,并且可能会自行重新启动。当您使用Intent时,应用程序会发出嘟嘟声并显示一个对话框,用户必须按下该对话框才能继续

我的总结如下:

语音识别器

  • 显示不同的UI或根本没有UI。你真的想让你的应用程序的UI发出嘟嘟声吗?您真的希望UI在出现错误时显示对话框并等待用户单击吗

  • 在进行语音识别时,应用程序可以执行其他操作

  • 可以在后台运行或从服务中识别语音

  • 可以更好地处理错误

  • 可以访问诸如原始音频或RMS之类的低级语音内容。分析音频或使用响度发出某种闪烁的灯光,以指示应用程序正在收听

意图

  • 一致且易于使用的用户界面
  • 易于编程
这是android版本4.1.1的一个变通方法

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)
        {

        }

    }
}
公共类MyService扩展服务
{
受保护的音频管理器;
受保护的语音识别器mSpeechRecognizer;
保护意图MSpeechRecognitizerIntent;
受保护的最终Messenger mServerMessenger=新Messenger(新入站管理器(此));
保护布尔误听;
受保护的易失性布尔计数错误;
私有布尔错流;
静态最终整数消息识别器开始监听=1;
静态最终int MSG_识别器_CANCEL=2;
@凌驾
public void onCreate()
{
super.onCreate();
mAudioManager=(AudioManager)getSystemService(Context.AUDIO\u服务);
mSpeechRecognizer=SpeechRecognizer.createSpeechRecognizer(this);
mSpeechRecognizer.setRecognitionListener(新建SpeechRecognitionListener());
mSpeechRecognizerIntent=新意图(RecognizerIntent.ACTION\u recognizer\u SPEECH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_语言_模型,
识别者意图、语言、模型、自由形式);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_调用_包,
这个.getPackageName());
}
受保护的静态类IncomingHandler扩展处理程序
{
私有WeakReference mtarget;
收入管理者(我的服务目标)
{
mtarget=新的WeakReference(目标);
}
@凌驾
公共无效handleMessage(消息消息消息)
{
final MyService target=mtarget.get();
开关(msg.what)
{
案例消息\u识别器\u开始\u侦听:
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.JELLY\u BEAN)
{
//关闭嘟嘟声
如果(!mIsStreamSolo)
{
mAudioManager.setStreamSolo(AudioManager.STREAM\u VOICE\u CALL,true);
mIsStreamSolo=真;
}
}
如果(!target.missending)
{
target.mSpeechRecognizer.startListening(target.mSpeechRecognizerIntent);
target.mislisting=true;
//Log.d(标记“消息开始侦听”);//$NON-NLS-1$
}
打破
案例消息识别器取消:
如果(密斯特兰索洛)
{
mAudioManager.setStreamSolo(AudioManager.STREAM\u VOICE\u CALL,false);
mIsStreamSolo=假;
}
target.mSpeechRecognizer.cancel();
target.mislisting=false;
//Log.d(标记“消息取消识别器”);//$NON-NLS-1$
打破
}
} 
} 
//果冻豆工作倒计时
受保护的倒计时mNoSpeechCountDown=新的倒计时(50005000)
{
@凌驾
公共void onTick(长毫秒未完成)
{
//TODO自动生成的方法存根
}
@凌驾
公共无效onFinish()
{
mIsCountDownOn=false;
Message Message=Message.get(空,消息识别器\u取消);