[英]Toggle airplane mode in Android
我做错了吗? 它不起作用。
public void airplane() {
boolean isEnabled = Settings.System.getInt(this.getApplicationContext().getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1;
Settings.System.putInt(context.getContentResolver(),Settings.System.AIRPLANE_MODE_ON,isEnabled ? 0 : 1);
//Settings.System.putInt(this.getApplicationContext().getContentResolver(),Settings.System.AIRPLANE_MODE_ON,isEnabled ? 0 : 1);
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
}
此答案包含执行此操作所需的代码。 还要确保您拥有WRITE_SETTINGS
权限。
改编自控制飞行模式:
// read the airplane mode setting
boolean isEnabled = Settings.System.getInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) == 1;
// toggle airplane mode
Settings.System.putInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);
// Post an intent to reload
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", !isEnabled);
sendBroadcast(intent);
以下可以在有根设备上使用。
从命令行,您可以使用以下命令打开/关闭飞行模式:
ON:
settings put global airplane_mode_on 1
am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true
OFF:
settings put global airplane_mode_on 0
am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false
这适用于 android 4.4.2+
没有root,没有系统级权限!
在AndroidManifest.xml添加权限:
<!--airplane mode-->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
然后:
@SuppressWarnings("deprecation")
private void initAirplanemodeBtn() {
airplanemodeButton = (ToggleButton) findViewById(R.id.airplanemode_btn);
airplanemodeButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (android.os.Build.VERSION.SDK_INT < 17) {
try {
// read the airplane mode setting
boolean isEnabled = Settings.System.getInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) == 1;
// toggle airplane mode
Settings.System.putInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);
// Post an intent to reload
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", !isEnabled);
sendBroadcast(intent);
} catch (ActivityNotFoundException e) {
Log.e(TAG, e.getMessage());
}
} else {
try {
Intent intent = new Intent(android.provider.Settings.ACTION_AIRPLANE_MODE_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} catch (ActivityNotFoundException e) {
try {
Intent intent = new Intent("android.settings.WIRELESS_SETTINGS");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} catch (ActivityNotFoundException ex) {
Toast.makeText(buttonView.getContext(), R.string.not_able_set_airplane, Toast.LENGTH_SHORT).show();
}
}
}
}
});
}
注意: NarendraR指出这不适用于最新版本。
我认为“Settings.System.AIRPLANE_MODE_ON”已被弃用,我正在使用:
public class AirplaneModeService {
public boolean run(Context context) {
boolean isEnabled = isAirplaneModeOn(context);
// Toggle airplane mode.
setSettings(context, isEnabled?1:0);
// Post an intent to reload.
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", !isEnabled);
context.sendBroadcast(intent);
return true;
}
public static boolean isAirplaneModeOn(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
return Settings.System.getInt(context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) != 0;
} else {
return Settings.Global.getInt(context.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
}
}
public static void setSettings(Context context, int value) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
Settings.System.putInt(
context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, value);
} else {
Settings.Global.putInt(
context.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, value);
}
}
}
我希望这对某人有帮助。
正如@eggyal 提到的那样,从 4.2 版及更高版本无法切换飞行模式。
但我们能做的就是把每一个无线服务:
可以使用 WifiService ~ getSystemService(Context.WIFI_SERVICE) 控制 Wifi。 可以使用 BluetoothAdapter-getSystemService(Context.BLUETOOTH_SERVICE) 控制蓝牙。
经过一些研究,我发现使用 Java 反射您仍然可以控制 Android Radios(Wifi、网络、蓝牙),飞行模式的主要作用是切换蓝牙、Wifi 和网络的状态。
因此,通过控制无线电,您实际上可以创建自己的飞行模式。
警告:在某些设备上使用反射可能会失败(取决于类的制造商实现)。
此示例代码切换移动网络:
private void setMobileRadioEnabled(boolean enabled) {
try {
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 setRadio = iConnectivityManagerClass.getDeclaredMethod("setRadio", Integer.TYPE , Boolean.TYPE);
setRadio.setAccessible(true);
for (NetworkInfo networkInfo : conman.getAllNetworkInfo()) {
if(isNetworkTypeMobile(networkInfo.getType())) {
setRadio.invoke(iConnectivityManager, networkInfo.getType(), enabled);
}
}
} catch (Exception e) {
Log.e(TAG, "Opss...", e);
}
}
public static boolean isNetworkTypeMobile(int networkType) {
switch (networkType) {
case ConnectivityManager.TYPE_MOBILE:
case ConnectivityManager.TYPE_MOBILE_MMS:
case ConnectivityManager.TYPE_MOBILE_SUPL:
case ConnectivityManager.TYPE_MOBILE_DUN:
case ConnectivityManager.TYPE_MOBILE_HIPRI:
case 10:
case 11:
case 12:
case 14:
return true;
default:
return false;
}
}
在每个设置之前使用 android.provider 像这样:
public class MainActivity extends Activity implements OnClickListener {
Button air;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
air = (Button) findViewById(R.id.button1);
air.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
// read the airplane mode setting
boolean isEnabled = android.provider.Settings.System.getInt(
getContentResolver(),
android.provider.Settings.System.AIRPLANE_MODE_ON, 0) == 1;
// toggle airplane mode
android.provider.Settings.System.putInt(
getContentResolver(),
android.provider.Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);
// Post an intent to reload
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", !isEnabled);
sendBroadcast(intent);
}
}
棒棒糖后,您可以使用以下方法,但它是隐藏的api,您的应用程序需要系统级权限
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL"/>
ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
mgr.setAirplaneMode(true);
请注意,如Android 4.2 API 中所述(强调已添加):
新的全局设置
通过添加
Settings.Global
,系统设置已更新以支持多个用户。 此设置集合类似于Settings.Secure
设置,因为它们是只读的,但全局适用于设备上的所有用户空间。一些现有设置从
Settings.System
或Settings.Secure
重新定位到这里。 如果您的应用程序当前正在更改之前在Settings.System
定义的Settings.System
(例如AIRPLANE_MODE_ON
),那么如果将这些设置移动到Settings.Global
,那么您应该期望这样做将不再适用于运行 Android 4.2或更高版本的设备。 您可以继续读取Settings.Global
中的Settings.Global
,但由于这些设置不再被认为可以安全地更改应用程序,因此尝试这样做将无声无息地失败,并且系统会在运行您的应用程序时向系统日志写入警告安卓 4.2 或更高版本。
这个对我有用
public static boolean isAirplaneModeOn() {
return Settings.System.getInt(mContext.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
}
public static void setAirPlaneMode(boolean airplaneMode) {
Logger.d(LOG_TAG + "setAirPlaneMode airplaneMode: " + airplaneMode) ;
int state = airplaneMode ? 1 : 0;
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON,
state);
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", state);
mContext.sendBroadcast(intent);
}
但是你需要系统权限
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
如果您想关闭互联网,我找到了适用于 17 岁以上的解决方法,这将起作用。
允许
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
方法
@SuppressWarnings({ "unchecked", "rawtypes" })
private void setMobileDataEnabled(boolean state) {
try {
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, state);
} catch (Exception e) {
e.printStackTrace();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.