通过VoiceRecognition从第三方活动返回到我的MainActivity

时间:2014-11-03 00:08:46

标签: android android-activity voice-recognition

我有一个通过语音命令启动的应用程序:

  1. Activity1(我应用的另一个活动)
  2. Activity2(我应用的另一个活动)
  3. 设备上安装的所有活动
  4. 我也可以通过向我的MainActivity说出数字5(“5”)从Activity1和Activity2返回。但是,如果我发起第三方活动,这不起作用。我的MainActivity并没有成为前景。以编程方式触发Back-Button也是可以的(虽然没有运气)。

    有人能给我一个暗示吗?

    到目前为止,这是我的代码:

     public class MainActivity extends Activity
        {
            public static ListView      wordsList;
    
            private SpeechRecognizer    mSpeechRecognizer;
            private Intent              mSpeechRecognizerIntent;
            public static Context       mContext    = null;
            public Button               mButton1    = null;
            public Button               mButton2    = null;
    
            @Override
            protected void onCreate(Bundle savedInstanceState)
            {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.voice_recog);
    
                mContext = this;
    
                ToggleButton speakButton = (ToggleButton) findViewById(R.id.speakButton);
    
                mButton1 = (Button) findViewById(R.id.button1);
                mButton2 = (Button) findViewById(R.id.button2);
    
                wordsList = (ListView) findViewById(R.id.list);
    
                // Disable button if no recognition service is present
                PackageManager pm = getPackageManager();
                List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
                if (activities.size() == 0)
                {
                    speakButton.setText("Recognizer not present");
                }
            }
    
            @Override
            public boolean onCreateOptionsMenu(Menu menu)
            {
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
            }
    
            public void speakButtonClicked(View v)
            {
                ToggleButton btn = (ToggleButton) v;
                if (btn.isChecked())
                    startVoiceRecognitionActivity();
                else
                    mSpeechRecognizer.stopListening();
            }
    
            public void button1Clicked(View v)
            {
    
                Intent i = new Intent(MainActivity.this, Activity1.class);
                this.startActivity(i);
            }
    
            public void button2Clicked(View v)
            {
    
                Intent i = new Intent(MainActivity.this, Activity2.class);
                this.startActivity(i);
            }
    
            private void startVoiceRecognitionActivity()
            {
                mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
                SpeechRecognitionListener listener = new SpeechRecognitionListener();
                mSpeechRecognizer.setRecognitionListener(listener);
    
                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());
    
                mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
            }
    
            public class SpeechRecognitionListener extends Activity implements RecognitionListener
            {
                @Override
                public void onResults(Bundle results)
                {
                    ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
                    wordsList.setAdapter(new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1, matches));
    
                    PackageManager packageManager = mContext.getPackageManager();
                    Intent main_intent = new Intent(Intent.ACTION_MAIN, null);
                    main_intent.addCategory(Intent.CATEGORY_LAUNCHER);
    
                    List<ResolveInfo> launchables = packageManager.queryIntentActivities(main_intent, 0);
    
                    for (int i = 0; i < matches.size(); i++)
                    {
    
                        String match = matches.get(i).toUpperCase();
                        for (int j = 0; j < launchables.size(); j++)
                        {
    
                            String activity = ((String) launchables.get(j).activityInfo.loadLabel(packageManager)).toUpperCase();
    
                            if (match.equals(activity))
                            {
                                String name = launchables.get(j).activityInfo.name;
                                String packageName = launchables.get(j).activityInfo.packageName;
    
                                ComponentName componentName = new ComponentName(packageName, name);
                                Intent intent = new Intent(Intent.ACTION_MAIN);
    
                                intent.addCategory(Intent.CATEGORY_LAUNCHER);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
                                intent.setComponent(componentName);
                                int tmp = 0;
                                mContext.startActivity(intent);
                                break;
                            }
                        }
    
                        if (match.equals("1"))
                        {
                            mButton1.performClick();
                            break;
                        }
    
                        if (match.equals("2"))
                        {
                            mButton2.performClick();
                            break;
                        }
    
                        if (match.equals("5"))
                        {
    
                            Intent intent = new Intent(MainActivity.this, MainActivity.class);
                            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                            mContext.startActivity(intent);
                            break;
                        }
    
                    }
                    startVoiceRecognitionActivity();
                }
            }
        }
    

1 个答案:

答案 0 :(得分:2)

  • 一旦您启动另一项活动,它就可以完全控制。您将无法拦截用户输入(密钥或语音)。

  • 一种选择是创建广播接收器并收听后退动作,或创建后台服务听取语音。

  • 当您检测到按下了后退键或语音操作时,请从广播接收器或后台服务中启动您的主要活动。

  • 您可以考虑将using SingleTask launch mode作为主要活动,以便它返回到现有的主要活动。