TTS для Android-приложений - PullRequest
       0

TTS для Android-приложений

0 голосов
/ 11 февраля 2012

Я создал приложение для Android, которое хорошо работает перед добавлением аудиоинтерфейса. Для учебника tts я перешел по этой ссылке

Код учебника работает нормально. но когда я использую его в своем коде, я получаю Null pointer exception at tts.speak(s, TextToSpeech.QUEUE_FLUSH, null); строку. Пожалуйста, помогите мне разобраться с этой проблемой. И я уверен, что проблема не в строке s, я проверил ее.

public class TimerActivity extends Activity implements OnInitListener {

    /** Called when the activity is first created. */

    Handler mhandler = new Handler();

    Button mybtn[] = new Button[12];

    Button select_btn, home_btn;

    EditText et;

    Bundle b;

    int var = 0;

    private int MY_DATA_CHECKCODE = 0;

    private TextToSpeech tts;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        select_btn = (Button) findViewById(R.id.ok);
        home_btn = (Button) findViewById(R.id.home);
        et = (EditText) findViewById(R.id.entry);
        et.setText("", TextView.BufferType.EDITABLE);
        b = new Bundle();

        for (int i = 0; i < mybtn.length; i++) {
            String btnid = "btn" + i;
            int resid = getResources().getIdentifier(btnid, "id",
                    getPackageName());
            mybtn[i] = (Button) findViewById(resid);
        }

        mybtn[var].requestFocus();
        Intent checkin = new Intent();
        checkin.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
        startActivityForResult(checkin, MY_DATA_CHECKCODE);

        select_btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Perform action on click

                Button bt;
                bt = (Button) getCurrentFocus();

                if (bt.equals(mybtn[10])) {
                    String s = et.getText().toString();
                    int l = s.length();

                    if (l > 0) {
                        String t;
                        if (l > 1)
                            t = s.substring(0, l - 1);
                        else
                            t = "";

                        et.setText(t, TextView.BufferType.EDITABLE);
                    }

                }

                else if (bt.equals(mybtn[11])) {

                    Intent in = new Intent(TimerActivity.this, Calling.class);
                    String s = et.getText().toString().trim();
                    b.putString("number", s);
                    in.putExtras(b);
                    if (s != null && s.length() > 0) {
                        tts.speak(s, TextToSpeech.QUEUE_ADD, null);
                        startActivity(in);
                        finish();
                    }

                    // else say enter a valid number
                }
                // CharSequence cs= bt.getText();
                // if(cs.equals(0))
                // et.setText("121");
                // else
                // if(!(bt.equals(0)))
                else
                    et.setText(et.getText() + "" + bt.getText(),
                            TextView.BufferType.EDITABLE);
                // else
                // et.setText("google",TextView.BufferType.EDITABLE);
            }
        });

        home_btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Perform action on click

                finish();
            }
        });

        final Runnable mUpdateTimeTask = new Runnable() {
            public void run() {
                // final long start= System.currentTimeMillis();
                // mhandler.removeCallbacks(this);
                // et.setText("i am the man");

                mybtn[var].requestFocus();
                String s = mybtn[var].getText().toString();
                s = "abcd";
                if (s != null && s.length() > 0)
                    tts.speak(s, TextToSpeech.QUEUE_FLUSH, null);
                var = (var + 1) % 12;
                // mybtn[var].requestFocus();

                mhandler.postDelayed(this, 2000);

            }
        };

        mhandler.postDelayed(mUpdateTimeTask, 100);

    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == MY_DATA_CHECKCODE) {
            if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
                // success, create the TTS instance
                tts = new TextToSpeech(this, this);
                tts.setLanguage(Locale.US);
            } else {
                // missing data, install it
                Intent installIntent = new Intent();
                installIntent
                        .setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                startActivity(installIntent);
            }
        }

    }

    @Override
    public void onInit(int status) {
        // TODO Auto-generated method stub

        if (status == TextToSpeech.SUCCESS) {
            Toast.makeText(TimerActivity.this,
                    "Text-To-Speech engine is initialized", Toast.LENGTH_LONG)
                    .show();
        } else if (status == TextToSpeech.ERROR) {
            Toast.makeText(TimerActivity.this,
                    "Error occurred while initializing Text-To-Speech engine",
                    Toast.LENGTH_LONG).show();
        }

    }

}

1 Ответ

0 голосов
/ 04 июля 2012

Прежде чем вызывать finish (), вам нужно вызвать tts.shutdown (), чтобы сообщить Android, что вы его больше не используете.Возможно, вам следует вызвать onDestroy ().Это остановит динамик после закрытия приложения.

...