如何等到用户启用移动数据并发送邮件?
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
我有一个任务,我必须每天发送一次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