0

メール クライアント オプションを使用せずにメールを送信したい。私は独自のカスタム メール ビューを持っています。ここからアイデアをダウンロードし ます。そしてそれはOSネットワーク例外を与えています。そのため、asynctask を使用して実行しますが、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.");
    }


}

}

マニフェスト ファイル:

 <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)
4

4 に答える 4

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


}

別のインスタンスを作成することはできません!

于 2013-04-04T10:29:25.720 に答える
1

それはosネットワーク例外を与えています

現在、 (UI スレッドから) メソッドからのToastメッセージを表示しようとしているためです。このメソッドは UI スレッドで呼び出されるため、Toast メッセージを表示するメソッドをdoInBackground使用します。onPostExecute次のように試してください:

@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...
    }  

編集:おそらく、クラスのオブジェクトを使用する前に初期化するのを忘れているNullPointerExceptionでしょう。新しいインスタンスを再度作成する代わりに、内部でオブジェクトを初期化します。mMailmonPreExecute

public void onPreExecute() {

    m = new Mail("user@gmail.com", ""); 
  ......
于 2013-04-04T10:24:52.840 に答える
0

インスタンス化されたローカル変数 Mail m = new Mail("user@gmail.com", ""); 内部ですが、内部onPreExecuteで使用しますif(m.send()) {doInBackground

Mail mクラスの属性である必要がありますListViewContactsLoader

何かのようなもの:

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

   private class ListViewContactsLoader extends AsyncTask<Void, Void, Boolean>{  
       private Mail m;
于 2013-04-04T10:27:16.750 に答える
0

それはosネットワーク例外を与えています

doInBackground()直接実行できないUI の更新/表示を試みているためです。

この問題を解決するには、次のいずれかを実行できます。

  1. onPostExecute() から Toast メッセージを表示する
  2. runOnUiThread()または、何らかの方法で UI を更新する場合は実装doInBackground()します。

例えば:

  runOnUiThread(new Runnable() {

        @Override
        public void run() {
            Toast.makeText(EmailSend .this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); 
        }
    });
于 2013-04-04T10:27:44.123 に答える