2015-10-05 89 views
2

我有一个任务,我必须每天发送E-Mail一次。 我使用Service触发AlarmManager来实现这一点。它工作正常。但问题是,只有移动数据可用,邮件才会发送。所以我试图打开数据连接并发送邮件。移动数据已启用,但Mail不发送。我在这里发布了我试过的东西。有人请提出一种方法,等待用户打开移动数据并发送邮件。谢谢。如何等待用户启用移动数据并发送邮件?

cm=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
     ni=cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
     isConnected=ni!=null&&ni.isConnected(); 

     Mail m=new Mail("[email protected]","xxxxxxx"); 
     String[] strTo={"[email protected]"}; 
     m.setTo(strTo); 
     m.setFrom("[email protected]"); 
     m.setSubject("Subject"); 
     m.setBody("Please find the attachment"); 

     try{ 
      m.addAttachment(Environment.getExternalStorageDirectory() + "/xxxxx/xxxxxx.xx"); 
      if (isConnected){ 
       m.send(); 
      }else { 
       ConnectivityManager dataManager; 
       dataManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
       Method dataMtd = null; 
       try { 
        dataMtd = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class); 
       } catch (NoSuchMethodException e) { 
        e.printStackTrace(); 
       } 
       dataMtd.setAccessible(true); 
       try { 
        dataMtd.invoke(dataManager, true); 
       } catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) { 
        e.printStackTrace(); 
       } 
       NetworkInfo netInfo=dataManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
       boolean isOnline=netInfo!=null&&netInfo.isConnected(); 
       if(isOnline){ 
        if (m.send()){ 
         ConnectivityManager dataManager1; 
         dataManager1 = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
         Method dataMtd1 = null; 
         try { 
          dataMtd1 = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class); 
         } catch (NoSuchMethodException e) { 
          e.printStackTrace(); 
         } 
         dataMtd1.setAccessible(false); 
         try { 
          dataMtd1.invoke(dataManager1, false); 
         } catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      } 
     }catch (final Exception e){ 
      e.printStackTrace(); 
      Log.v("My_Service",e.toString()); 
     } 
+0

您是否试过广播接收器发送电子邮件 –

+0

我无法在'BroadcastReceiver'中执行'Asynctask'。 –

+0

从**广播接收器**开始**服务**并在服务中运行**异步** –

回答

0

你可以注册一个BroadcastReceiver,当移动数据被启用时被通知。

注册的BroadcastReceiver:

IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)); 
registerReceiver(broadcastReceiver, intentFilter); 

然后在您的BroadcastReceiver做这样的事情:

@Override 
public void onReceive(Context context, Intent intent) { 
    final String action = intent.getAction(); 
    if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION))) { 
     if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)){ 
      // data connection was lost 
     } else { 
      // do your stuff 
     } 
    } 
} 

欲了解更多信息,请参阅BroadcastReceiver

您可以使用下面链接的文档发送邮件:

How to send mail without user interaction from another application

+0

我试图在启用数据后立即发送邮件。它导致了错误。现在,我已经在启用数据后增加了5分钟的时间来发送邮件。现在它工作正常。 –

+0

@PraveenKumar - 你应该使用操作助手 - 做与互联网连接重试(因为也可能是soex超时) - 我不同意提议的解决方案 - 如果在发送过程中连接将丢失? – ceph3us

+0

@Tomasz最好,我可以理解你的关注,但你可以请举一些这样做的例子吗? – KishuDroid

1

不要在谷歌API的狗屎......转发给信息用户启用数据+后延迟例如,时间任务:) u能不能通过启用数据来处理所有问题..但是你可以检查大多数:有可能通过防火墙问题,DNS问题,TTL问题等等。

+0

是的。我加了'Handler.postDealayed',它工作正常。谢谢。 –

相关问题