代码之家  ›  专栏  ›  技术社区  ›  Shivam Kumar mnp343

如何隐藏吐司消息您的音频将发送到谷歌提供语音识别服务。在Android中?

  •  3
  • Shivam Kumar mnp343  · 技术社区  · 6 年前

    我正在使用谷歌语音识别器在安卓系统中集成语音服务,但当按下麦克风按钮时,这条烦人的吐司消息正在显示。请给我一个隐藏吐司信息的方法。

    这是我的Java代码

    public class FormActivity extends AppCompatActivity {
    
        AppCompatEditText mFeedbackView; 
        ImageView mFeedbackVoiceView;
        private final int REQ_CODE_SPEECH_INPUT_FEEDBACK = 100;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_form);
            Toolbar toolbar = findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
    
            mVisitFeedbackView = findViewById(R.id.feedback);
            mFeedbackVoiceView = findViewById(R.id.feedback_voice);
    
            mFeedbackVoiceView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    promptSpeechInputFeedback();
                }
            });
        }
        private void promptSpeechInputFeedback() {
            Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
            intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getString(R.string.speech_prompt));
            try {
                startActivityForResult(intent, REQ_CODE_SPEECH_INPUT_FEEDBACK);
            } catch (ActivityNotFoundException a) {
                Toast.makeText(getApplicationContext(), getString(R.string.speech_not_supported), Toast.LENGTH_SHORT).show();
            }
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            switch (requestCode) {
                case REQ_CODE_SPEECH_INPUT_FEEDBACK: {
                    if (resultCode == RESULT_OK && null != data) {
                        ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
                        mFeedbackView.setText(result.get(0));
                    }
                    break;
                }  
            }
        }
    }
    

    这个问题是 How to hide toast“ Your audio will be sent to google to provide speech recognition service.” in Speech Recognizer? 但没有解决办法。

    任何帮助都将不胜感激。

    2 回复  |  直到 6 年前
        1
  •  4
  •   Chief Madog    6 年前

    基于android规则 无法隐藏系统Toast消息,因为您没有访问系统视图的权限,

    只有在jailbrake android中,你才能尝试访问终端。

        2
  •  1
  •   Mohit Singh    6 年前

    你可以做一个自定义语音识别器,这将给你更多的控制用户界面。mainActivity打开一个新的DialogFragment,它实现了RecognitionListener。

    public class MainActivity extends AppCompatActivity implements VoiceRecognizerInterface {
        Button button ;
        TextView textView;
        String string;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            button = findViewById(R.id.button);
            textView = findViewById(R.id.textView);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    FragmentManager fragmentManager = getSupportFragmentManager();
                    if (fragmentManager != null && fragmentManager.findFragmentByTag("dialogVoiceRecognizer") == null && !isFinishing()) {
                        VoiceRecognizerDialogFragment languageDialogFragment = new VoiceRecognizerDialogFragment(MainActivity.this,MainActivity.this);
                        languageDialogFragment.show(fragmentManager, "dialogVoiceRecognizer");
                    }
                }
            });
        }
    
        @Override
        public void spokenText(String spokenText) {
            textView.setText(spokenText);
        }
    }
    

    一个接口,用于在stt之后发出主活动的信号。

    public interface VoiceRecognizerInterface {
        void spokenText(String spokenText);
    }
    

    自定义SpeechToText对话框。

    public class VoiceRecognizerDialogFragment extends DialogFragment implements RecognitionListener{
    
        ImageView micImage;
        TextView stateTV;
        TextView displayTV;
    
        private SpeechRecognizer mSpeechRecognizer;
        private Intent mSpeechRecognizerIntent;
        private Context context;
        VoiceRecognizerInterface signal;
    
        @SuppressLint("ValidFragment")
        public VoiceRecognizerDialogFragment(Context context, VoiceRecognizerInterface signal) {
            this.context = context;
            this.signal = signal;
        }
    
        public VoiceRecognizerDialogFragment(){
    
        }
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.voice_recognizer_custom_layout ,container, false );
    
            //Mic tap to listen again
            micImage = view.findViewById(R.id.micImageView);
            //Displays Listening.. when recognizer is listening
            stateTV = view.findViewById(R.id.stateTV);
            //Displays message if error
            displayTV = view.findViewById(R.id.displayTV);
    
            mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(context);
            mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
            mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                    RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
            //Customize language by passing language code
            mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,"en");
            //To receive partial results on the callback
            mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS,true);
            mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
                    context.getPackageName());
            mSpeechRecognizer.setRecognitionListener(this);
            mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
            micImage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    startListening();
                }
            });
            return view;
    
        }
    
        public void startListening(){
            mSpeechRecognizer.setRecognitionListener(this);
            mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
            changeUIStateToListening();
        }
    
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            if (mSpeechRecognizer != null) {
                mSpeechRecognizer.destroy();
            }
        }
    
        @Override
        public void onBeginningOfSpeech()
        {
        }
    
        @Override
        public void onBufferReceived(byte[] buffer)
        {
    
        }
    
        @Override
        public void onEndOfSpeech()
        {
        }
    
        @Override
        public void onError(int error)
        {
            if(error == 7){
               changeUIStateToRetry();
            }
        }
    
        @Override
        public void onEvent(int eventType, Bundle params)
        {
    
        }
    
        @Override
        public void onPartialResults(Bundle partialResults) {
        }
    
        @Override
        public void onReadyForSpeech(Bundle params)
        {
    
        }
    
        @Override
        public void onResults(Bundle results)
        {
            ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            if(matches == null){
                return;
            }
            int i =0;
            String first ="";
            for(String s : matches){
                if(i==0){
                    first = s;
                }
                i++;
            }
            // sending text to MainActivity using Interface
            signal.spokenText(first);
            this.dismiss();
        }
    
        @Override
        public void onRmsChanged(float rmsdB)
        {
        }
    
        public void changeUIStateToListening(){
            displayTV.setText("Tell us what you need");
            stateTV.setText("Listening...");
        }
    
        public void changeUIStateToRetry(){
            displayTV.setText("Didn't catch that. Try\nSpeaking again");
            stateTV.setText("Tap on mic to try again");
        }
    }