如何等到用户启用移动数据并发送邮件?

How to wait until user enables mobile data and send mail?

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

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

        Mail m=new Mail("xxxxxxxxx@gmail.com","xxxxxxx");
        String[] strTo={"xxxxxxxxx@gmail.com"};
        m.setTo(strTo);
        m.setFrom("xxxxxxxxxx@gmail.com");
        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());
        }

您需要 BroadcastReceiver 监听数据连接的变化。参考 - http://developer.android.com/reference/android/content/BroadcastReceiver.html

检查此以获取特定于网络连接的参考 - Check INTENT internet connection

不要在 Google 狗屎 api... 向用户提供信息以启用数据 + post 延迟,例如时间任务 :) 你无法通过以下方式处理所有问题启用数据.. 但你可以检查大多数:可能是防火墙问题,DNS 问题,TTL 问题等

您可以注册一个 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

的文档

您可以使用下面的link发送邮件:

How to send mail without user interaction from another application