Note that there are some explanatory texts on larger screens.

plurals
  1. POAndroid Service to send email, code error
    primarykey
    data
    text
    <p>I am developing a service to get current sim card value and detect whether sim card changed, if so i would like to implement JavaMail API in my service, which mean my service is able to send email.</p> <p>Below is my code, code error in MyService.java</p> <p>In row</p> <pre><code>public class GMailAsync extends AsyncTask&lt;String, Void, String&gt; </code></pre> <p>showing error </p> <pre><code>illegal modifier for the local class GMailAsync; only abstract or final is permitted </code></pre> <p>Could someone guide me on this ? I want to enable my service to send email without user interact.</p> <p><strong>MyService.java</strong></p> <pre><code>public class MyService extends Service { String storedSimSerial; String currentSimSerial; @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); TelephonyManager telephoneMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); storedSimSerial = telephoneMgr.getSimSerialNumber(); Log.e("SimSerial::",storedSimSerial); TelephonyManager tmMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); currentSimSerial = tmMgr.getSimSerialNumber(); Log.e("Current Sim Serial::",currentSimSerial); if(currentSimSerial.equals(storedSimSerial)) { Log.e("Sim Status","Sim no changed !!!"); } else Log.e("Sim Status","Sim changed !!!"); public class GMailAsync extends AsyncTask&lt;String, Void, String&gt;{ @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub String mail_body = "Sim serial number is "+currentSimSerial; String subject = "Your Sim has changed!!!"; GMailSender sender = new GMailSender("testing123@gmail.com", "testing"); try { sender.sendMail(subject, mail_body + "\nTGenerated Email", "testing123@gmail.com",null); } catch (Exception e) { Log.e("SendMail", e.getMessage(), e); } return null; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); Log.d("Mail","Sent"); } } return Service.START_STICKY; } @Override public void onDestroy() { super.onDestroy(); Toast.makeText(this, "Service Destroy", Toast.LENGTH_LONG).show(); } @Override public IBinder onBind(Intent arg0) { return null; } } </code></pre> <p><strong>GMailSender.java</strong></p> <pre><code>import javax.activation.DataHandler; import javax.activation.DataSource; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.security.Security; import java.util.Properties; public class GMailSender extends javax.mail.Authenticator { private String mailhost = "smtp.gmail.com"; private String user; private String password; private Session session; static { Security.addProvider(new com.example.JSSEProvider()); } public GMailSender(String user, String password) { this.user = user; this.password = password; Properties props = new Properties(); props.setProperty("mail.transport.protocol", "smtp"); props.setProperty("mail.host", mailhost); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.port", "465"); props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.quitwait", "false"); session = Session.getDefaultInstance(props, this); } protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, password); } public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception { try{ MimeMessage message = new MimeMessage(session); DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain")); message.setSender(new InternetAddress(sender)); message.setSubject(subject); message.setDataHandler(handler); if (recipients.indexOf(',') &gt; 0) message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients)); else message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients)); Transport.send(message); }catch(Exception e){ } } public class ByteArrayDataSource implements DataSource { private byte[] data; private String type; public ByteArrayDataSource(byte[] data, String type) { super(); this.data = data; this.type = type; } public ByteArrayDataSource(byte[] data) { super(); this.data = data; } public void setType(String type) { this.type = type; } public String getContentType() { if (type == null) return "application/octet-stream"; else return type; } public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(data); } public String getName() { return "ByteArrayDataSource"; } public OutputStream getOutputStream() throws IOException { throw new IOException("Not Supported"); } } } </code></pre> <p><strong>JSSEProvider.java</strong></p> <pre><code>public class JSSEProvider extends Provider { /** * */ private static final long serialVersionUID = 1L; public JSSEProvider() { super("HarmonyJSSE", 1.0, "Harmony JSSE Provider"); AccessController.doPrivileged(new java.security.PrivilegedAction&lt;Void&gt;() { public Void run() { put("SSLContext.TLS", "org.apache.harmony.xnet.provider.jsse.SSLContextImpl"); put("Alg.Alias.SSLContext.TLSv1", "TLS"); put("KeyManagerFactory.X509", "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl"); put("TrustManagerFactory.X509", "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl"); return null; } }); } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload