2015-10-05 30 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',它工作正常。謝謝。 –

相關問題