Android11 初始化失败问题处理
//初始化new TextToSpeech(Context context, OnInitListener listener);
原因:Android11 软件包可见性问题导致TextToSpeech初始化失败,只需要在AndroidManifest.xml文件中增加<queries>标签即可
增加权限
... <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/><queries><intent><action android:name="android.intent.action.TTS_SERVICE" /></intent></queries><application ...
Demo示例,实现一个读取输入文字的功能
布局文件xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><EditTextandroid:id="@+id/editText"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="请输入要朗诵的字" /><Buttonandroid:id="@+id/btn_read"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="读" /></LinearLayout>
代码:
package com.jhq.texttospeech;import android.os.Bundle;import android.speech.tts.TextToSpeech;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import java.util.Locale;public class MainActivity extends AppCompatActivity implements View.OnClickListener, TextToSpeech.OnInitListener {private Button speechBtn; // 按钮控制开始朗读private EditText speechTxt; // 需要朗读的内容private TextToSpeech textToSpeech; // TTS对象@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);speechBtn = (Button) findViewById(R.id.btn_read);speechBtn.setOnClickListener(this);speechTxt = (EditText) findViewById(R.id.editText);//初始化textToSpeech = new TextToSpeech(this, this); // 参数Context,TextToSpeech.OnInitListener}/*** 用来初始化TextToSpeech引擎* status:SUCCESS或ERROR这2个值* setLanguage设置语言,帮助文档里面写了有22种* TextToSpeech.LANG_MISSING_DATA:表示语言的数据丢失。* TextToSpeech.LANG_NOT_SUPPORTED:不支持*/@Overridepublic void onInit(int status) {if (status == TextToSpeech.SUCCESS) {int result = textToSpeech.setLanguage(Locale.CHINA);if (result == TextToSpeech.LANG_MISSING_DATA|| result == TextToSpeech.LANG_NOT_SUPPORTED) {Toast.makeText(this, "数据丢失或不支持", Toast.LENGTH_SHORT).show();}} else {Log.e("TTS", "Initilization Failed!");}}@Overridepublic void onClick(View v) {if (textToSpeech != null && !textToSpeech.isSpeaking()) {textToSpeech.setPitch(0.0f);// 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规textToSpeech.speak(speechTxt.getText().toString(),TextToSpeech.QUEUE_FLUSH, null);}}@Overrideprotected void onStop() {super.onStop();textToSpeech.stop(); // 不管是否正在朗读TTS都被打断textToSpeech.shutdown(); // 关闭,释放资源}}