说话失败:在TextToSpeech功能中没有完全设置引擎连接

时间:2016-02-08 14:31:36

标签: java android eclipse email text-to-speech

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 {
    private static final int MY_DATA_CHECK_CODE = 1234;
    public static Context c,b;
    public TextToSpeech tts;
    public static Intent serviceIntent;
    private static int myNotificationId;


    public static class  ReadMailSample extends AsyncTask<String,String,Void> implements TextToSpeech.OnInitListener{
        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="avarote1994@gmail.com" ;                   // 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();
           tts = new TextToSpeech(c,ReadMailSample.this);  


      }

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

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



      }



      @Override
      public void onInit(int status) {

      if (status == TextToSpeech.SUCCESS) {
          tts.speak(command, TextToSpeech.QUEUE_FLUSH, null);
          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 {

              speakOut();
          }

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

      }


      public void speakOut() {
          tts.speak("hello hi", TextToSpeech.QUEUE_FLUSH, null);
          }



          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 = "avarote1994@gmail.com";
              // 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) {
        c = this.getApplicationContext();

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        ReadMailSample rd=new ReadMailSample(getApplicationContext());
    System.out.println("hello");
    rd.execute();
    System.out.println("------xvsdfsdfsd---------aefaefa-----------------");
    }




    @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);
    }
}

我正在尝试实现texttospeech功能。我收到了上述错误。该功能在异步线程中运行。异步线程读取邮件。我想将阅读邮件转换为语音。

Logcat:
02-08 21:45:26.009: I/System.out(12947): TESTING
02-08 21:45:26.709: I/System.out(12947): javax.mail.internet.MimeMultipart@21cdab10
02-08 21:45:26.709: I/System.out(12947): amulya
02-08 21:45:27.279: I/System.out(12947): Content Multipart= 1221235487821,ad:af:12:2a:d5:c8,High,IT IS THURSDAY TAKE TABLETS,future

02-08 21:45:27.279: I/System.out(12947): use,future use,future use

02-08 21:45:27.279: I/System.out(12947): 1
02-08 21:45:27.279: I/System.out(12947): 1221235487821
02-08 21:45:27.279: I/System.out(12947): ---------------------adasd-----------1221235487821
02-08 21:45:27.299: W/TextToSpeech(12947): speak failed: TTS engine connection not fully set up
02-08 21:45:29.689: D/dalvikvm(12947): GC_FOR_ALLOC freed 455K, 19% free 5727K/7068K, paused 7ms, total 7ms
02-08 21:45:30.499: I/System.out(12947): Number of mails = 0
02-08 21:45:36.029: I/System.out(12947): Number of mails = 0

2 个答案:

答案 0 :(得分:0)

从Api文档中我们看到,OnInitListener的实现是必要的,以接收TTS初始化完成的通知。这在TextToSpeech文档中也有描述,其中声明语音将在初始化之前失败。在下文中,我不会尝试修复所有代码以使其正常工作,但我会指出您当前是如何误用TTS框架并向您推动正确的方向。

虽然您已经实现了onInitListener,但您没有对该实现做任何有用的事情。下面,我展示一些更有用的东西,其中一个捕获onInitListener的{​​{1}}回调的结果,以便保持知道TTS的初始化状态。

onInit

此外,我不会将TextToSpeech初始化作为AsyncTask的一部分运行。如果我是你,我会搬家

... private boolean mIsTTSInited = false; // member indicating TTS initialization state ... // Receives notification of initialization public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { Log.i("TTS", "Initilization Succeeded!"); // save the state indicating success of TTS initialization mIsTTSInited = true; ... } else { Log.e("TTS", "Initilization Failed!"); mIsTTSInited = false; } } ... ... @Override protected void onProgressUpdate(String... values) { // A trivial example to show how you can check the state of initialization for TTS if (mIsTTSInited) { showNotification(); speakOut(); } else { // code to deal with TTS not init'ed case } }

进入tts = new TextToSpeech(c,ReadMailSample.this);而不是onCreate。我在herehere

的教程中看到了这一点

答案 1 :(得分:0)

我已经通过听觉语音解决了这个问题

import android.content.Context;
import android.speech.tts.TextToSpeech;
import android.util.Log;

import java.util.HashMap;
import java.util.Locale;

public class Speecher implements TextToSpeech.OnInitListener {

    private static final String TAG = "TextToSpeechController";
    private TextToSpeech myTTS;
    private String textToSpeak;
    private Context context;

    private static Speecher singleton;

    public static Speecher getInstance(Context ctx) {
        if (singleton == null)
            singleton = new Speecher(ctx);
        return singleton;
    }

    private Speecher(Context ctx) {
        context = ctx;
    }

    public void speak(String text) {
        textToSpeak = text;

        if (myTTS == null) {
            // currently can\'t change Locale until speech ends
            try {
                // Initialize text-to-speech. This is an asynchronous operation.
                // The OnInitListener (second argument) is called after
                // initialization completes.
                myTTS = new TextToSpeech(context, this);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        sayText();

    }

    public void onInit(int initStatus) {
        if (initStatus == TextToSpeech.SUCCESS) {
            if (myTTS.isLanguageAvailable(Locale.UK) == TextToSpeech.LANG_AVAILABLE)
                myTTS.setLanguage(Locale.UK);
                myTTS.setPitch((float) 0.9);
        }

        // status can be either TextToSpeech.SUCCESS or TextToSpeech.ERROR.
        if (initStatus == TextToSpeech.SUCCESS) {
            int result = myTTS.setLanguage(Locale.UK);
            if (result == TextToSpeech.LANG_MISSING_DATA
                    || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                Log.e(TAG, "TTS missing or not supported (" + result + ")");
                        // Language data is missing or the language is not supported.
                        // showError(R.string.tts_lang_not_available);

            } else {
                // Initialization failed.
                Log.e(TAG, "Error occured");
            }

        }
    }

    private void sayText() {
        HashMap<String, String> myHash = new HashMap<String, String>();
        myHash.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "done");
        String[] splitspeech = this.textToSpeak.split("\\\\");

        for (int i = 0; i < splitspeech.length; i++) {

            if (i == 0) { // Use for the first splited text to flush on audio stream
                myTTS.speak(splitspeech[i].toString().trim(), TextToSpeech.QUEUE_FLUSH,     myHash);

            } else { // add the new test on previous then play the TTS

                myTTS.speak(splitspeech[i].toString().trim(), TextToSpeech.QUEUE_ADD,     myHash);
            }
            myTTS.playSilence(100, TextToSpeech.QUEUE_FLUSH,  null);
        }

    }

    public void stopTTS() {
        if (myTTS != null) {
            myTTS.shutdown();
            myTTS.stop();
            myTTS = null;
        }
    }

}

从任何地方调用方法... Speecher.getInstance(getApplicationContext())。speak(YOUR_TTS_MESSAGE_HERE);