Naar content
Trending apps
  • Inbox by Gmail

  • Maps: Navigatie en OV

  • WhatsApp Messenger

  • Messenger

  • Facebook

Trending games
  • Minecraft Earth

  • Dr. Mario World

  • Harry Potter: Wizards Unite

  • Breaking Bad: Criminal Elements

  • The Elder Scrolls: Blades

Trending smartphones
  • Moto G8 Plus

  • Microsoft Surface Duo

  • OnePlus 7T Pro

  • Nokia 7.2

  • Xiaomi Mi 9T Pro

Nieuwste tablets
  • Samsung Galaxy Tab S6

  • Samsung Galaxy Tab A 10.5

  • Samsung Galaxy Tab S4

  • Samsung Galaxy Tab S3 9.7

  • Asus Zenpad 3S 10

Wim81

Wim81

  • Lid sinds 26 oktober 2015
  • Berichten 37
  • Reputatie 0
  • #1
  • 26 oktober 2015
  • 17:10

Beste allen,

ik ben een app aan het schrijven waarbij de gebruiker enkele velden moet invullen en nadien op een knop kan klikken om alle velden in een mail te versturen.

Het is de bedoeling dat de mail in de achtergrond wordt verstuurt.
Ik heb hiervoor een Java klasse op Internet gevonden.
Mijn probleem is nu dat ik de volgende error klrijg: "android.os.NetworkOnMainThreadException"
Hierbij zegt de error uiteraard dat de mail niet kon vezonden worden.

Ik heb alles gedaan wat op die website stond, zoals alle juiste jar files geimporteerd en de code exact over genomen.

De link van de velden die moeten worden ingevuld en de mail onderdelen zoals het subject of de body heb ik nog niet gelinkt, maar wel de tekst hardcoded opgevuld.

Kan iemand zien wat er juist fout loopt?

Hier is de Java klasse:

package be.wimvangeyt.djverzoekjes; import java.util.Date; import java.util.Properties; import javax.activation.CommandMap; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.activation.MailcapCommandMap; import javax.mail.BodyPart; import javax.mail.Multipart; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; public class Mail extends javax.mail.Authenticator { private String _user; private String _pass; private String[] _to ={"", ""}; private String _from; private String _port; private String _sport; private String _host; private String _subject; private String _body; private boolean _auth; private boolean _debuggable; private Multipart _multipart; public Mail() { _host = "smtp.gmail.com"; // default smtp server _port = "465"; // default smtp port _sport = "465"; // default socketfactory port _user = ""; // username _pass = ""; // password _from = ""; // email sent from _subject = ""; // email subject _body = ""; // email body _debuggable = false; // debug mode on or off - default off _auth = true; // smtp authentication - default on _multipart = new MimeMultipart(); // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); CommandMap.setDefaultCommandMap(mc); } public Mail(String user, String pass) { this(); _user = user; _pass = pass; } public boolean send() throws Exception { Properties props = _setProperties(); if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { Session session = Session.getInstance(props, this); MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(_from)); InternetAddress[] addressTo = new InternetAddress[_to.length]; for (int i = 0; i < _to.length; i++) { addressTo[i] = new InternetAddress(_to[i]); } msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); msg.setSubject(_subject); msg.setSentDate(new Date()); // setup message body BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText(_body); _multipart.addBodyPart(messageBodyPart); // Put parts in message msg.setContent(_multipart); // send email Transport.send(msg); return true; } else { return false; } } public void addAttachment(String filename) throws Exception { BodyPart messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(filename); _multipart.addBodyPart(messageBodyPart); } @Override public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(_user, _pass); } private Properties _setProperties() { Properties props = new Properties(); props.put("mail.smtp.host", _host); if(_debuggable) { props.put("mail.debug", "true"); } if(_auth) { props.put("mail.smtp.auth", "true"); } props.put("mail.smtp.port", _port); props.put("mail.smtp.socketFactory.port", _sport); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.fallback", "false"); return props; } // the getters and setters public String getBody() { return _body; } public void setBody(String _body) { this._body = _body; } public String[] getTo() { return _to; } public void setTo(String[] _to) { this._to = _to; } public String getFrom() { return _from; } public void setFrom(String _from) { this._from = _from; } public String getSubject() { return _subject; } public void setSubject(String _subject) { this._subject = _subject; } }
Het volgende is de code van de activity:

package be.wimvangeyt.djverzoekjes; import android.os.AsyncTask; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.widget.Button; import android.widget.Toast; public class VerzoekActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_verzoek); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); Button send = (Button) findViewById(R.id.sendVerzoek); send.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Mail m = new Mail("wim81.vangeyt@gmail.com", "Minidisc1"); { String[] toArr = {"wimvangeyt@outlook.com"}; m.setTo(toArr); m.setFrom("wim81.vangeyt@gmail.com "); m.setSubject("This is the subject"); m.setBody("Email body"); try { if (m.send()) { Toast.makeText(VerzoekActivity.this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); } else { Toast.makeText(VerzoekActivity.this, "Email was not sent.", Toast.LENGTH_LONG).show(); } } catch( Exception e ) { Log.e("VerzoekActivity", "Could not send Email", e); } } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_verzoek, 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(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }




Bewerkt (26 oktober 2015 17:11)
Timelord

Timelord

  • Lid sinds 05 juni 2010
  • Berichten 2337
  • Reputatie 20
  • #2
  • 26 oktober 2015
  • 18:02

Heb je in je Manifest file wel toegang tot internet en zo gegeven ?

Bewerkt (26 oktober 2015 18:03)

Oukitel K5000 7.0 (nog) ongeroot
Samsung Note geroot 4.2.1 Spirit Rom (op sterven na dood)
HTC Desire geroot Slim Rom 4.4.4
HTC one X + geroot 4.2.2 ViperX+ 2.1.1
One plus one geroot 6.01
LG P990 geroot 2.3
Samsung A8 ongeroot (werk)
Umidigi a5 Pro ongeroot (nog wel).

Wim81

Wim81

  • Lid sinds 26 oktober 2015
  • Berichten 37
  • Reputatie 0
  • #3
  • 26 oktober 2015
  • 18:18

Dag TimeLord,


dat heb ik zeker

Wim81

Wim81

  • Lid sinds 26 oktober 2015
  • Berichten 37
  • Reputatie 0
  • #4
  • 26 oktober 2015
  • 18:21

Dit is de volledige foutmelding:

10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: Could not send Email
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: android.os.NetworkOnMainThreadException
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1154)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at java.net.InetAddress.getLocalHost(InetAddress.java:365)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at javax.mail.internet.InternetAddress.getLocalAddress(InternetAddress.java:517)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at javax.mail.internet.UniqueValue.getUniqueMessageIDValue(UniqueValue.java:99)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at javax.mail.internet.MimeMessage.updateMessageID(MimeMessage.java:2054)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2076)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2042)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at javax.mail.Transport.send(Transport.java:117)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at be.wimvangeyt.djverzoekjes.Mail.send(Mail.java:104)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at be.wimvangeyt.djverzoekjes.VerzoekActivity$2.onClick(VerzoekActivity.java:48)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at android.view.View.performClick(View.java:4569)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at android.view.View$PerformClick.run(View.java:18570)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at android.os.Handler.handleCallback(Handler.java:743)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at android.os.Handler.dispatchMessage(Handler.java:99)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at android.os.Looper.loop(Looper.java:136)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at android.app.ActivityThread.main(ActivityThread.java:5212)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at java.lang.reflect.Method.invokeNative(Native Method)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at java.lang.reflect.Method.invoke(Method.java:515)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
10-26 18:21:27.875 20763-20763/be.wimvangeyt.djverzoekjes E/VerzoekActivity: at dalvik.system.NativeStart.main(Native Method)

Timelord

Timelord

  • Lid sinds 05 juni 2010
  • Berichten 2337
  • Reputatie 20
  • #5
  • 26 oktober 2015
  • 18:42

This exception is thrown when an application attempts to perform a networking operation on its main thread.

Run your code in AsyncTask

Oukitel K5000 7.0 (nog) ongeroot
Samsung Note geroot 4.2.1 Spirit Rom (op sterven na dood)
HTC Desire geroot Slim Rom 4.4.4
HTC one X + geroot 4.2.2 ViperX+ 2.1.1
One plus one geroot 6.01
LG P990 geroot 2.3
Samsung A8 ongeroot (werk)
Umidigi a5 Pro ongeroot (nog wel).

Sander

Sander

  • Lid sinds 23 september 2009
  • Berichten 424
  • Reputatie 30
  • AdminAdmin
  • #6
  • 26 oktober 2015
  • 20:10

Het probleem is inderdaad het gebruik van het netwerk op de main thread. Die main thread wordt gebruikt voor de interface en daar mag je niet te veel werk op doen, omdat de interface anders gaat haperen. Wanneer je gebruik maakt van een netwerkverbinding om bestanden op te halen, zal dat in veel gevallen voor vertragingen zorgen. Daarom is het niet toegestaan om dat soort verbindingen te maken op de mail thread. Je zult dus gebruik moeten maken van bijvoorbeeld een AsyncThread die het werk op de achtergrond doet en de resultaten doorgeeft aan de main thread.

Wim81

Wim81

  • Lid sinds 26 oktober 2015
  • Berichten 37
  • Reputatie 0
  • #7
  • 26 oktober 2015
  • 20:14

Ok. Dank je voor het antwoord. Ik ga dit zeker bekijken.

Sander

Sander

  • Lid sinds 23 september 2009
  • Berichten 424
  • Reputatie 30
  • AdminAdmin
  • #8
  • 26 oktober 2015
  • 20:31

Hier is een tutorial van Google zelf voor het gebruik van een netwerkverbinding: https://developer.android.com/training/basics/network-ops/connecting.html.

Wim81

Wim81

  • Lid sinds 26 oktober 2015
  • Berichten 37
  • Reputatie 0
  • #9
  • 26 oktober 2015
  • 21:06

Hier is een tutorial van Google zelf voor het gebruik van een netwerkverbinding: https://developer.android.com/training/basics/network-ops/connecting.html.
Dank je Sander. Ik ga het eens bekijken.

Wim81

Wim81

  • Lid sinds 26 oktober 2015
  • Berichten 37
  • Reputatie 0
  • #10
  • 27 oktober 2015
  • 22:33

Ik heb de AsyncTask gebruikt en het ziet er veel belovend uit.

Echter heb ik nu in mijn code iets raars voor. Ik gebruik de InternetAddress.parse in mijn setRecipient().

Als je de package moet importeren dan stelt Android Studio de javax.mail.internet.InternetAddress.

Doch als je deze package importeert, dan geeft hij de fout dat InternetAddress.parse() het verkeerde type is en hij het javax.mail.Address package verwacht.

Dit is heel raar. Iemand tips?

Btw.: dank je voor de tip van de AsyncTask.

Wim

Reageer

Om te reageren, dien je te zijn ingelogd. Druk op de onderstaande knop om in te loggen of maak een nieuwe account aan.

Inloggen Registreren