我在 Android 中收到 nullPointerException。我正在通过通知实现文字转语音功能

I am getting nullPointerException in Android. I am implementing texttospeech functionality with the notification

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.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 {
    public static Context c,b;
    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 onProgressUpdate(String... values) {
            try {
                 System.out.println("---------------------adasd-----------" + time_stamp);
                 speakOut();
                 showNotification();      
            }
            catch(Exception e){
                e.printStackTrace();
            }           



      }


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

      @Override
      public void onInit(int status) {

      if (status == TextToSpeech.SUCCESS) {

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

      }

      private void speakOut() {

      tts.speak(command, 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);
            speakOut();
        }






      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);
        if (!isMyServiceRunning()){
            serviceIntent = new Intent(getApplicationContext(),MyService.class);
            c.startService(serviceIntent);
       }
        final SQLiteDatabase db = openOrCreateDatabase("GDV_DB_NEW_0711", Context.MODE_PRIVATE, null);
        db.execSQL("CREATE TABLE IF NOT EXISTS Login4(mailid VARCHAR,password VARCHAR);");
        db.execSQL("CREATE TABLE IF NOT EXISTS CLIENT_DATA(type VARCHAR,time_stamp VARCHAR,priority VARCHAR,result VARCHAR,opt1 VARCHAR,opt2 VARCHAR,opt3 VARCHAR);");

        ReadMailSample rd=new ReadMailSample(getApplicationContext());
    System.out.println("hello");
    rd.execute();
    System.out.println("------xvsdfsdfsd---------aefaefa-----------------");
    }
    private boolean isMyServiceRunning() {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (MyService.class.getName().equals(service.service.getClassName())) {
                return true;
            }
        }

        return false;
    }


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

有一个后台线程doInBackground()线程运行读取邮件,然后读取的邮件正文应与语音一起通知。现通知实施。但是当我包含 TextToSpeech 代码时,出现错误。

日志如下所示:

02-05 11:13:40.273: W/System.err(959): java.lang.NullPointerException
02-05 11:13:40.273: W/System.err(959):  at com.example.trynot.MainActivity$ReadMailSample.speakOut(MainActivity.java:143)
02-05 11:13:40.273: W/System.err(959):  at com.example.trynot.MainActivity$ReadMailSample.onProgressUpdate(MainActivity.java:99)
02-05 11:13:40.283: W/System.err(959):  at com.example.trynot.MainActivity$ReadMailSample.onProgressUpdate(MainActivity.java:1)
02-05 11:13:40.283: W/System.err(959):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:648)
02-05 11:13:40.283: W/System.err(959):  at android.os.Handler.dispatchMessage(Handler.java:102)
02-05 11:13:40.283: W/System.err(959):  at android.os.Looper.loop(Looper.java:136)
02-05 11:13:40.283: W/System.err(959):  at android.app.ActivityThread.main(ActivityThread.java:5001)
02-05 11:13:40.283: W/System.err(959):  at java.lang.reflect.Method.invokeNative(Native Method)
02-05 11:13:40.293: W/System.err(959):  at java.lang.reflect.Method.invoke(Method.java:515)
02-05 11:13:40.293: W/System.err(959):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
02-05 11:13:40.323: W/System.err(959):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
02-05 11:13:40.323: W/System.err(959):  at dalvik.system.NativeStart.main(Native Method)
02-05 11:13:43.083: I/ActivityManager(364): Delay finish: com.android.providers.calendar/.CalendarProviderBroadcastReceiver
02-05 11:13:43.163: I/ActivityManager(364): Resuming delayed broadcast
02-05 11:13:44.873: I/System.out(959): Number of mails = 0
02-05 11:13:45.853: D/dalvikvm(510): GC_FOR_ALLOC freed 529K, 17% free 3306K/3944K, paused 150ms, total 157ms
02-05 11:13:49.073: I/System.out(959): Number of mails = 0
02-05 11:13:51.203: I/MediaFocusControl(364):  AudioFocus  abandonAudioFocus() from android.media.AudioManager@b2d85530com.android.music.MediaPlaybackService@b2d843b0
02-05 11:13:53.273: I/System.out(959): Number of mails = 0
02-05 11:13:54.583: D/dalvikvm(959): GC_FOR_ALLOC freed 450K, 16% free 3158K/3728K, paused 88ms, total 88ms
02-05 11:13:57.883: I/System.out(959): Number of mails = 0

你的TextToSpeech(tts)是null,你忘了实例化它。

覆盖 AsyncTaskonPreExecute() 方法,然后添加 tts = new TextToSpeech(Context, ReadMailSample.this); 以实例化 TextToSpeech:

@Override
protected void onPreExecute() {
     super.onPreExecute();
     tts = new TextToSpeech(Context, ReadMailSample.this); // i think your Context is "acn", make sure its not null when onPreExecute() is called
}

PS:

没有理由导入TextToSpeech两次! (import android.speech.tts.TextToSpeech;)