0

I want to send email without using Email Clients option. I have my own Custom Email View . I download the idea from here . And it is giving os Network exception. so for this i use asynctask and run it but i receive errors in Logcat

EmailSend.java:

public class EmailSend extends Activity{


Mail m ;


@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.activity_main); 

    Button addImage = (Button) findViewById(R.id.send_email); 



    addImage.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View view) { 

            new ListViewContactsLoader().execute();

        } 
    }); 
} 



/** An AsyncTask class to retrieve and load listview with contacts */
private class ListViewContactsLoader extends AsyncTask<Void, Void, Boolean>{    

    public ListViewContactsLoader() {

    }

    @Override
    protected Boolean doInBackground(Void... params) {


        try { 
            // m.addAttachment("/sdcard/filelocation"); 

            if(m.send()) { 
                Toast.makeText(EmailSend .this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); 
                return true;
            } else { 
                Toast.makeText(EmailSend .this, "Email was not sent.", Toast.LENGTH_LONG).show(); 

                return false;
            } 
        } catch(Exception e) { 
            //Toast.makeText(MailApp.this, "There was a problem sending the email.", Toast.LENGTH_LONG).show(); 
            Log.e("MailApp", "Could not send email", e); 

            return false;
        }
    }




    @Override
    protected void onPostExecute(Boolean result) {          
        // Setting the cursor containing contacts to listview



    }   

    public void onPreExecute() {

        Mail m = new Mail("user@gmail.com", ""); 

        String[] toArr = {"bla@bla.com", "lala@lala.com"}; 
        m.setTo(toArr); 
        m.setFrom("wooo@wooo.com"); 
        m.setSubject("This is an email sent using my Mail JavaMail wrapper from an Android device."); 
        m.setBody("Email body.");
    }


}

}

Manifest File:

 <uses-permission android:name="android.permission.WAKE_LOCK" />

  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<uses-permission android:name="android.permission.READ_CONTACTS" />

LogCat:

   Could not send email

           java.lang.NullPointerException

at com.example.emailer.EmailSend$ListViewContactsLoader.doInBackground(EmailSend.java:54)

at com.example.emailer.EmailSend$ListViewContactsLoader.doInBackground(EmailSend.java:1)

at android.os.AsyncTask$2.call(AsyncTask.java:252)

at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

at java.util.concurrent.FutureTask.run(FutureTask.java:137)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)

at java.lang.Thread.run(Thread.java:1020)
Community
  • 1
  • 1
User42590
  • 2,473
  • 12
  • 44
  • 85

4 Answers4

1

it is giving os Network exception

because currently you are trying to show Toast messages from doInBackground(from on UI Thread) method. use onPostExecute method for showing Toast messages because this method called on UI Thread. try it as :

@Override
    protected void onPostExecute(Boolean result) {          
        // Setting the cursor containing contacts to listview
         if(result){
           // show Toast Message here
          }else{
           // show Toast Message here
           }
         //.....your code here...
    }  

EDIT : you are getting NullPointerException probably you forget to initialize m object of Mail class before using it. initialize m object inside onPreExecute as instead of creating new instance again :

public void onPreExecute() {

    m = new Mail("user@gmail.com", ""); 
  ......
ρяσѕρєя K
  • 132,198
  • 53
  • 198
  • 213
1
public void onPreExecute() {

    this.m = new Mail("user@gmail.com", ""); 

    String[] toArr = {"bla@bla.com", "lala@lala.com"}; 
    m.setTo(toArr); 
    m.setFrom("wooo@wooo.com"); 
    m.setSubject("This is an email sent using my Mail JavaMail wrapper from an Android device."); 
    m.setBody("Email body.");
}


}

You can't make anather instance!

fenix
  • 1,716
  • 2
  • 20
  • 26
0

You have instantiated local variable Mail m = new Mail("user@gmail.com", ""); inside onPreExecute but then you use if(m.send()) { inside doInBackground

Mail m should be attribute of class ListViewContactsLoader

Something like:

public void onPreExecute() {
        m = new Mail("user@gmail.com", ""); 

and

   private class ListViewContactsLoader extends AsyncTask<Void, Void, Boolean>{  
       private Mail m;
Igor
  • 1,835
  • 17
  • 15
0

it is giving os Network exception

Because you are trying update/display on UI from doInBackground() which isn't possible directly.

To resolve this issue, you can do either one of the following:

  1. Display Toast message from onPostExecute()
  2. or implement runOnUiThread() if you want to update UI from doInBackground() any how.

For example:

  runOnUiThread(new Runnable() {

        @Override
        public void run() {
            Toast.makeText(EmailSend .this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); 
        }
    });
Paresh Mayani
  • 127,700
  • 71
  • 241
  • 295