2016-02-12 113 views
0

我試圖實現texttospeech功能。我收到上述錯誤。該功能在異步線程中運行。異步線程讀取郵件。我想轉換讀郵件speech.If我運行作爲一個單獨的功能,那麼它的工作原理,但是當我與異步任務整合,它不工作發言失敗:tts引擎連接未完全設置

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="avar[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); 
    }  
} 

回答

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. 另外,在ReadMailSample類中刪除private TextToSpeech tts;。如果您在AsyncTask中使用tts,它可能會導致錯誤的引用。

  3. 最後,我建議你在你的AsyncTask中設置方法。我認爲你可以在doInBackground()中收到郵件。所以,在後臺任務之後,您可以在onPostExecute()中用tts實例說出該消息。

如果您更清楚地編輯您的代碼,我會再發佈一個詳細的源代碼。

+0

我試過在onPostExecute()方法中包含tts。但控制不會去那個方法。我希望我的異步線程始終運行。我該怎麼辦。我應該怎樣編輯我的代碼 –

+0

如果你想在後臺任務後在'onPostExecute()'中處理一些控件,把它們聲明爲AsyncTask的meber變量。首先,你可以在編輯檢查點1和2後檢查'tts'是否在'speakout()'mehtod發出聲音? – Kae10

+0

演講結束後,我得到這個特殊的例外 –