android 进入飞行模式吗,在Android中切换飞行模式

10 个答案:

答案 0 :(得分:41)

This answer包含执行此操作所需的代码。另外,请确保您拥有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);

答案 1 :(得分:13)

以下内容可用于rooted设备。

在命令行中,您可以使用以下选项打开/关闭飞行模式:

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 +

答案 2 :(得分:10)

适用于所有API版本。

切换authomaticaly以获取API< 17

打开飞机的默认活动

API> = 17的用户操作模式

没有root,没有系统级权限!

在AndroidManifest.xml中添加权限:

然后:

@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();

}

}

}

}

});

}

答案 3 :(得分:8)

我认为“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);

}

}

}

我希望这有助于某人。

答案 4 :(得分:4)

由于@eggyal提到切换飞行模式无法从版本4.2及更高版本完成。

但我们能做的就是转变每一项无线服务:

可以使用WifiService~getSystemService(Context.WIFI_SERVICE)控制Wifi。

可以使用BluetoothAdapter-getSystemService(Context.BLUETOOTH_SERVICE)控制蓝牙。

经过一番研究后,我发现使用Java Reflection你仍然可以控制Android无线电(Wifi,网络,蓝牙),飞机模式基本上做的是切换蓝牙,Wifi和网络的状态。

因此,通过控制无线电,您可以实际创建自己的飞行模式。

警告:在某些设备上使用Reflection可能会失败(取决于制造商对类的实现)。

此示例代码切换移动网络:

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;

}

}

答案 5 :(得分:4)

在棒棒糖之后,您可以使用以下方法,但它是隐藏的api,您的应用程序需要系统级权限

ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

mgr.setAirplaneMode(true);

答案 6 :(得分:3)

此前每个设置都使用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);

}

}

答案 7 :(得分:3)

请注意,正如Android 4.2 APIs(强调添加)中所述:

新的全局设置

系统设置已更新,以支持多个用户添加Settings.Global。此设置集类似于Settings.Secure设置,因为它们是只读的,但全局适用于设备上的所有用户空间。

此处的几个现有设置已从Settings.System或Settings.Secure重新定位。如果您的应用当前正在更改之前在Settings.System中定义的设置(例如AIRPLANE_MODE_ON),那么您应该预期这样做将不再适用于运行Android 4.2的设备Settings.Global,则更高或更高。您可以继续阅读Settings.Global但中的设置,因为设置不再被视为安全的应用更改,尝试这样做会无声地失败,系统会写一个警告在Android 4.2或更高版本上运行应用程序时的系统日志。

答案 8 :(得分:1)

这个适用于我

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);

}

但是你需要系统权限

答案 9 :(得分:-1)

如果您想关闭互联网,我发现此解决方案适用于17+。

许可

方法

@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();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值