如何在Android中以编程方式打开3G移动数据?
您好,我正在开发一个Android应用程序,我希望在检测到Wifi未连接到手机时能够自动打开移动数据,因为我希望确保无论Wifi是否连接,电子邮件都能发送出去。。。因此,一旦检测到wifi未连接,3G数据将打开,电子邮件将发送出去,数据网络将关闭如何在Android中以编程方式打开3G移动数据?,android,3g-network,Android,3g Network,您好,我正在开发一个Android应用程序,我希望在检测到Wifi未连接到手机时能够自动打开移动数据,因为我希望确保无论Wifi是否连接,电子邮件都能发送出去。。。因此,一旦检测到wifi未连接,3G数据将打开,电子邮件将发送出去,数据网络将关闭 我可以知道如何打开3G网络和关闭3G网络吗???网上的资料很少,我希望有人能帮我解决这个问题。。。谢谢…出于安全考虑,您不允许以编程方式打开移动网络 您只能通过显示设置来提示用户打开移动网络 package com.testing.connection
我可以知道如何打开3G网络和关闭3G网络吗???网上的资料很少,我希望有人能帮我解决这个问题。。。谢谢…出于安全考虑,您不允许以编程方式打开移动网络 您只能通过显示设置来提示用户打开移动网络
package com.testing.connection;
import android.app.Activity;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class ConnectionActivity extends Activity implements OnClickListener{
Button press;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
press = (Button)findViewById(R.id.button1);
press.setOnClickListener(this);
}
public void onClick(View view){
ConnectivityManager mgr = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
boolean is3G = mgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();
boolean isWifi = mgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();
if(isWifi){
Toast.makeText(this, "WiFi connected...", Toast.LENGTH_LONG).show();
sendMail();
}
else{
//**Turn on Mobile Data
//**Then sendMail()
//**Turn off Mobile Data
}
}
public void sendMail() throws MessagingException{
String host = "smtp.gmail.com";
String password = "abc123";
String from = "testing@gmail.com";
String toAddress = enterEmail.getText().toString();
Properties properties = System.getProperties();
properties.put("mail.smtp.host", host);
properties.put("mail.smtps.auth", true);
properties.put("mail.smtp.starttls.enable", true);
Session session = Session.getInstance(properties, null);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO, toAddress);
message.setSubject("Anti-Theft Attachment");
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText("Your email address is saved as backup email in Anti-Theft Application");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
message.setContent(multipart);
try{
Transport transport = session.getTransport("smtps");
transport.connect(host, from, password);
transport.sendMessage(message, message.getAllRecipients());
System.out.println("Mail Sent Successfully");
transport.close();
} catch (SendFailedException sfe){
System.out.println(sfe);
}
}
}
希望这段代码能对你有所帮助,在我的情况下它是有效的
Intent intent=new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS);
ComponentName cn = new ComponentName("com.android.phone","com.android.phone.Settings");
intent.setComponent(cn);
startActivity(intent);
明显地
ConnectivityManager dataManager;
dataManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
Method dataMtd = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class);
dataMtd.setAccessible(true);
dataMtd.invoke(dataManager, true); //True - to enable data connectivity .
适用于Android 2.3及以上版本
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
这还需要以下权限
private void setMobileDataEnabled(Context context, boolean enabled) {
final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final Class conmanClass = Class.forName(conman.getClass().getName());
final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
iConnectivityManagerField.setAccessible(true);
final Object iConnectivityManager = iConnectivityManagerField.get(conman);
final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
setMobileDataEnabledMethod.setAccessible(true);
setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
}
请参考这个
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
哇,我希望你做不到!如果我关闭了手机上的3G数据,那是因为我不想使用3G数据。这不是由你的应用程序在我背后打开它!!!如果我的手机没有连接Wifi,那么我无法发送电子邮件,因此我必须打开3g数据发送电子邮件,并在发送电子邮件后将其关闭。。。就是这样……您是否考虑过通知用户他们没有任何连接,然后通过按钮打开设置?这将是一种更加用户友好的方式来完成您想要做的事情。我的应用程序是一种防盗应用程序,我敢打赌,一旦接到通知,盗贼将永远不会打开3g数据……在AndroidL中,setMobileDataEnabled API从ConnectionManager中删除,并移动到TelephonyManager(setDataEnabled/getDataEnabled)。此外,API也受到限制,只能由系统应用程序访问。请同意这种想法,但管理者(主要来自测试背景和客户端,因为其他一些应用程序已经做到了)java.lang.RuntimeException:无法启动activity ComponentInfo{…}:java.lang.SecurityException:权限拒绝:启动意图{act=android.settings.DATA\u ROAMING\u settings cmp=com.android.phone/.settings}来自进程记录{427dfb88 10208:co.akura.passio/U0A1020}(pid=10208,uid=10020),未从uid 1001导出
public class TurnDataOn {
public static boolean isWifiOn(Context context) {
WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
boolean wifiEnabled = wifiManager.isWifiEnabled();
Log.e("isWifiOn", String.valueOf(wifiEnabled));
return wifiEnabled;
}
public static boolean isWifiConnected(Context context) {
ConnectivityManager connectivityManager =
(ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
NetworkInfo wifiInfo =
connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
boolean wifiConnected = wifiInfo.getState() == NetworkInfo.State.CONNECTED;
Log.e("isWIFIConnected", String.valueOf(wifiConnected));
return wifiConnected;
}
public static boolean isGprsConnected(Context context) {
ConnectivityManager connectivityManager =
(ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
NetworkInfo mobileInfo =
connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
boolean mobileConnected = mobileInfo.getState() == NetworkInfo.State.CONNECTED;
Log.e("ISGPRSConnected", String.valueOf(mobileConnected));
return mobileConnected;
}
public static void toggleGprs(Context context, boolean whatToDo) {
ConnectivityManager conman = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
@SuppressWarnings("rawtypes") Class conmanClass = null;
try {
conmanClass = Class.forName(conman.getClass().getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Field iConnectivityManagerField = null;
try {
iConnectivityManagerField = conmanClass.getDeclaredField("mService");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
iConnectivityManagerField.setAccessible(true);
Object iConnectivityManager = null;
try {
iConnectivityManager = iConnectivityManagerField.get(conman);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
@SuppressWarnings("rawtypes") Class iConnectivityManagerClass = null;
try {
iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
@SuppressWarnings("unchecked") Method setMobileDataEnabledMethod = null;
try {
setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
setMobileDataEnabledMethod.setAccessible(true);
try {
setMobileDataEnabledMethod.invoke(iConnectivityManager, whatToDo);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
final ConnectivityManager conman = (ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVICE);
Method dataMtd = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class);
dataMtd.setAccessible(false);
dataMtd.invoke(conman, false);
final ConnectivityManager conman = (ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVICE);
Method dataMtd = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class);
dataMtd.setAccessible(true);
dataMtd.invoke(conman, true);