Amulya D V
Amulya D V

Reputation: 47

speak failed: tts engine connection not fully setup

I am trying to implement texttospeech functionality. I am getting the above error. The functionality runs in async thread. The async thread reads mail. I want to convert the read mail to speech.If i run as a seperate functionality then it works but when i integrate with the async task , it is not working

package com.example.trynot;

import java.io.IOException;
import java.util.Calendar;
import java.util.Locale;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Flags.Flag;
import javax.mail.search.FlagTerm;

import com.example.trynot.MainActivity;
import com.example.trynot.R;


import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.sax.StartElementListener;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import android.speech.tts.TextToSpeech;

public class MainActivity extends Activity implements TextToSpeech.OnInitListener{
    private static final int MY_DATA_CHECK_CODE = 1234;
    public static Context c,b;
    public static TextToSpeech tts;
    public static Intent serviceIntent;
    private static int myNotificationId;


    public static class  ReadMailSample extends AsyncTask<String,String,Void> {
        Message message;
        private TextToSpeech tts;
        static String command, phoneNumber, type, priority, name, time_stamp, imei, opt1, opt2, opt3, fromSubString;
        Properties properties = null;
        private Session session = null;
        private Store store = null;
        private Folder inbox = null;
        String userName="[email protected]" ;                   // PROVIDE RECEPIENT EMAIL ID
        String password="amul11111994" ;                            // PROVIDE RECEPIENT PASSWORD
        static SQLiteDatabase db;
        boolean flag=false;
        Context acn;
        //private Bundle savedInstanceState;


        protected Void doInBackground(String...params){                     // SEPARATE THREAD TO RUN IN THE BACKGROUND
            try{
                readMails();
            } 
            catch(Exception e){
                Logger logger = Logger.getAnonymousLogger();
                logger.log(Level.INFO, "an exception was thrown", e);
            }
            return null;
        }



      ReadMailSample(SQLiteDatabase db){
        this.db = db;
      }

      ReadMailSample(){ 
      }

      ReadMailSample(Context cn){   
      acn=cn;
      }
      @Override
      protected void onPreExecute() {
           super.onPreExecute();



      }

      @Override
      protected void onProgressUpdate(String... values) {
            try {

                System.out.println("---------------------adasd-----------" + time_stamp);
                 showNotification(); 
                 MainActivity.speakOut();
            }
            catch(Exception e){
                e.printStackTrace();
            }           



      }









          public void showNotification() {
            PendingIntent notificationIntent = preparePendingIntent();
            Notification notification = createBasicNotification(notificationIntent);
            displayNotification(notification);
        }


        @SuppressLint("InlinedApi")
        private PendingIntent preparePendingIntent() {
            Intent intent=new Intent(c,MainActivity.class); 
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

            PendingIntent pendingIntent = PendingIntent.getActivity(
                    c, 
                    0, 
                    intent, 
                    PendingIntent.FLAG_UPDATE_CURRENT);
            return pendingIntent;
        }

        private Notification createBasicNotification(PendingIntent notificationIntent) {
            NotificationCompat.Builder builder = new Builder(c);
            long[] vibrationPattern = {0, 200, 800, 200, 600, 200, 400, 200, 200, 200, 100, 200, 50, 200, 50, 200, 50, 200, 50, 200};


            Notification notification = builder
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle("Medication Reminder")
                    .setContentText(command)
                    .setAutoCancel(true)
                    .setContentIntent(notificationIntent)
                    .setWhen(Calendar.getInstance().getTimeInMillis() + 1000*60+60)
                    .setVibrate(vibrationPattern)

                    .build();

            return notification;
        }


        private void displayNotification(Notification notification) {

            NotificationManager notificationManager = (NotificationManager)c.getSystemService(Context.NOTIFICATION_SERVICE);
            myNotificationId=(int) System.currentTimeMillis();
            notificationManager.notify(myNotificationId , notification);

        }






      public void readMails() throws IOException{
          System.out.println("READMAIL hi");    
          properties = new Properties();

          // SETTING UP AN IMAP SERVER TO ACCESS THE RECEPIENT'S EMAIL
          properties.setProperty("mail.host", "imap.gmail.com");
          properties.setProperty("mail.port", "995");
          properties.setProperty("mail.transport.protocol", "imaps");
          while(true){// CONTINUOUSLY MONITOR INCOMING MAIL'S
              //String cq = "select * from Login4";
              //Cursor c = db.rawQuery(cq, null);
              //    c.moveToFirst();
              //final String userName = c.getString(0);
              //final String password = c.getString(1);
              //String cloud = "[email protected]";
              // AUTHENTICATE AND GET AN INSTANCE OF THE SESSION FROM THE SERVER
              session = Session.getInstance(properties,new javax.mail.Authenticator() {
                  protected PasswordAuthentication getPasswordAuthentication() {
                      return new PasswordAuthentication(userName, password);
                  }
              });
              try {
                  store = session.getStore("imaps");    
                  store.connect();
                  inbox = store.getFolder("INBOX");         // ACCESS THE INBOX OF THE RECEPIENT'S EMAIL ID
                  inbox.open(Folder.READ_WRITE);                // OPEN THE INBOX IN READ-WRITE MODE
                  Message messages[] = inbox.search(new FlagTerm(new Flags(Flag.SEEN), false));     //SEARCH INBOX FOR ANY UNREAD MAILS
                  System.out.println("Number of mails = " + messages.length);
                  for (int i = 0; i < messages.length; i++) {               // PROCESS ALL THE UNREAD MAILS
                        message = messages[i];
                        Address[] from = message.getFrom();
                        String from1 = from[0].toString();
                        System.out.println(from1);
                        if(from1.contains("<")){
                            int start = from1.indexOf("<");
                            int end = from1.indexOf(">");
                            fromSubString = from1.substring(start+1,end);   // RETRIEVE THE SENDER'S EMAIL ID
                        } else{
                            fromSubString = from1;
                        }
                        System.out.println(fromSubString);
                        //if(fromSubString.equals(cloud)){      // CHECK WHETHER THE MAIL IS FROM THE CLOUD
                        String[] subject = message.getSubject().split(","); // SPLIT THE SUBJECT
                        System.out.println("hi");
                        type = subject[0];                                  // STORE THE DETAILS IN RESPECTIVE VARIABLES
                        phoneNumber =subject[1];
                        name = subject[2];
                        System.out.println(type);
                        System.out.println(phoneNumber);
                        System.out.println(name);
                        //String body=message.getContentType().toString();
                       // System.out.print(body);
                         processMessageBody(message);
                         //System.out.println("--------------------------------");
                //        }
                    }
                    inbox.close(true);
                    store.close();
                }
                catch (NoSuchProviderException e) {
                    e.printStackTrace();
                }
                catch (MessagingException e) {
                    e.printStackTrace();
                }  
            } 
          }

      public void processMessageBody(Message message) {
          try {

              Object content = message.getContent();
              String msg=content.toString();

              System.out.println(msg);
              if (content instanceof Multipart) {                       // IF MAIL HAS MULTIPART MESSAGE
                  Multipart multiPart = (Multipart) content;
                  procesMultiPart(multiPart);
              }
              else{
                  System.out.println("Content = "+content);
                  processSinglepart(content.toString());
              } 
          }
          catch (IOException e) {
              e.printStackTrace();
          }
          catch (MessagingException e) {
              e.printStackTrace();
          }
      }

      public void processSinglepart(String content){
        String[] body = content.split(",");         // SPLIT THE CONTENTS OF THE BODY
        System.out.println('1');

          time_stamp = body[0];                             // STORE THE DETAILS IN RESPECTIVE VARIABLES
          command = body[3];
          System.out.println(time_stamp);
          //tts.speak(time_stamp, TextToSpeech.QUEUE_FLUSH, null);
          publishProgress(command);



     }

    public void procesMultiPart(Multipart content) {
          System.out.println("amulya");
          try {
              BodyPart bodyPart = content.getBodyPart(0);               // RETRIEVE THE CONTENTS FROM THE BODY
              Object o;

              o = bodyPart.getContent();
              if (o instanceof String) {
              System.out.println("Content Multipart= "+o.toString());
              processSinglepart(o.toString());
              }
          } 
          catch (IOException e) {
              e.printStackTrace();
          } 
          catch (MessagingException e) {
              e.printStackTrace();
          }

      }




    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        tts = new TextToSpeech(this, this);
        c = this.getApplicationContext();

          moveTaskToBack(true);

        ReadMailSample rd = new ReadMailSample();
        rd.execute();  

    }

    @Override
    public void onInit(int status) {

    if (status == TextToSpeech.SUCCESS) {
        tts = new TextToSpeech(this, this);
        int result = tts.setLanguage(Locale.US);

        if (result == TextToSpeech.LANG_MISSING_DATA
                || result == TextToSpeech.LANG_NOT_SUPPORTED) {
            Log.e("TTS", "This Language is not supported");
        } else {
            //buttonSpeak.setEnabled(true);
            speakOut();
        }

    } else {
        Log.e("TTS", "Initilization Failed!");
    }

    }



    @Override
    public void onDestroy() {
        // Don't forget to shutdown tts!
        if (tts != null) {
            tts.stop();
            tts.shutdown();
        }
        super.onDestroy();
    }

    private static void speakOut() {

        tts.speak("hello", TextToSpeech.QUEUE_FLUSH, null);
        }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }     
}

Upvotes: 0

Views: 1583

Answers (1)

Kae10
Kae10

Reputation: 669

Try to execute your AsyncTask in here:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    tts = new TextToSpeech(this, this);
    c = this.getApplicationContext();

    moveTaskToBack(true);

    //ReadMailSample rd = new ReadMailSample();
    //rd.execute();  // If it is declared here, your tts will not operate.

}

@Override
public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {
        tts = new TextToSpeech(this, this);
        int result = tts.setLanguage(Locale.US);

        if (result == TextToSpeech.LANG_MISSING_DATA
                || result == TextToSpeech.LANG_NOT_SUPPORTED) {
            Log.e("TTS", "This Language is not supported");
        } else {
            //buttonSpeak.setEnabled(true);
            speakOut();
            ReadMailSample rd = new ReadMailSample();
            rd.execute();  // It will be operate well.
        }

    } else {
        Log.e("TTS", "Initilization Failed!");
    }
}

When the constructor of TextToSpeech is operated, OnInitListener is executed asynchronously.

So, if constructing TTS instance and executing your custom AsycnTask are operated sequantially in onCreate() method, errors will be occur because you use tts in your AsyncTask before tts is initialized!


I want to post more detail answer, but your code is too complicated to read. So I give you some check points.

  1. You create tts instance two times. Try to remove tts = new TextToSpeech(this, this); in onInit() method.

  2. Also, delete private TextToSpeech tts; in ReadMailSample class. It may causes wrong reference if you use tts in your AsyncTask.

  3. Finally, I recommand you to set onPostExecute() method in your AsyncTask. I think you can get mail in doInBackground(). So, after background task, you can speak that message with tts instance in onPostExecute().

If you edit your code more clearly, I'll post one more with detail source code.

Upvotes: 0

Related Questions