说不通:发动机连接没有完全设置

时间:2016-02-12 04:50:11

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

我正在尝试实现texttospeech功能。我收到了上述错误。该功能在异步线程中运行。异步线程读取邮件。我想将读取的邮件转换为语音。如果我作为单独的功能运行,那么它可以工作,但当我与异步任务集成时,它无法正常工作

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="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();



      }

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

1 个答案:

答案 0 :(得分:0)

尝试在此处执行AsyncTask:

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

TextToSpeech的构造函数被操作时,OnInitListener被异步执行。

因此,如果构造TTS实例并执行自定义AsycnTask在onCreate()方法中进行间接操作,则会发生错误,因为在初始化tts之前在AsyncTask中使用了tts!

我想发布更详细的答案,但您的代码太复杂,无法阅读。所以我给你一些检查点。

  1. 您创建tts个实例两次。尝试删除tts = new TextToSpeech(this, this);方法中的onInit()

  2. 此外,请删除private TextToSpeech tts;课程中的ReadMailSample。如果在AsyncTask中使用tts,可能会导致错误的引用。

  3. 最后,我建议您在AsyncTask中设置onPostExecute()方法。我想你可以在doInBackground()收到邮件。因此,在后台任务之后,您可以在tts中使用onPostExecute()实例说出该消息。

  4. 如果您更清楚地编辑代码,我会再发布一个详细的源代码。