其他分享
首页 > 其他分享> > 如何打开/关闭飞行模式,即使在新的Android版本(甚至是root)上?

如何打开/关闭飞行模式,即使在新的Android版本(甚至是root)上?

作者:互联网

Android 4.2开始,使用普通API不支持打开/关闭飞行模式.

它应该在授予WRITE_SECURE_SETTINGS权限时起作用,但这仅适用于系统应用程序(正如我所读).

要在具有root的设备上执行该操作应该怎么做?

系统应用程序是否还需要root才能切换飞行模式?

解决方法:

要在Android植根设备(手机,平板电脑,便笺)上打开和关闭飞行/飞行模式,您可以执行以下操作:

private final String COMMAND_FLIGHT_MODE_1 = "settings put global airplane_mode_on";
private final String COMMAND_FLIGHT_MODE_2 = "am broadcast -a android.intent.action.AIRPLANE_MODE --ez state";

@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
public void setFlightMode(Context context) {
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
        // API 17 onwards.
        if (isRooted(context)) {            
            int enabled = isFlightModeEnabled(context) ? 0 : 1;
            // Set Airplane / Flight mode using su commands.
            String command = COMMAND_FLIGHT_MODE_1 + " " + enabled;
            executeCommandWithoutWait(context, "-c", command);
            command = COMMAND_FLIGHT_MODE_2 + " " + enabled;
            executeCommandWithoutWait(context, "-c", command);
        } else {                
            try {
               // No root permission, just show Airplane / Flight mode setting screen.
               Intent intent = new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS);
               intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
               context.startActivity(intent);
            } catch (ActivityNotFoundException e) {
               Log.e(TAG, "Setting screen not found due to: " + e.fillInStackTrace());
            }
        }
    } else {
        // API 16 and earlier.
        boolean enabled = isFlightModeEnabled(context);
        Settings.System.putInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, enabled ? 0 : 1);
        Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        intent.putExtra("state", !enabled);
        context.sendBroadcast(intent);
    }

要检查飞机/飞行模式是否已打开和关闭,请执行以下操作:

@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
private boolean isFlightModeEnabled(Context context) {
    boolean mode = false;
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
        // API 17 onwards 
        mode = Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) == 1;
    } else {
        // API 16 and earlier.
        mode = Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1;
    }
    return mode;
}

要执行su命令,请执行以下操作:

private void executeCommandWithoutWait(Context context, String option, String command) {
    boolean success = false;
    String su = "su";
    for (int i=0; i < 3; i++) {
        // "su" command executed successfully.
        if (success) {
            // Stop executing alternative su commands below. 
            break;
        }
        if (i == 1) {
            su = "/system/xbin/su";
        } else if (i == 2) {
            su = "/system/bin/su";
        }       
        try {
            // execute command
            Runtime.getRuntime().exec(new String[]{su, option, command});
        } catch (IOException e) {
            Log.e(TAG, "su command has failed due to: " + e.fillInStackTrace());
        }   
    }
}

或者,如果你的应用程序:

>签署了Android框架证书;和
>已安装到/ system / app /目录;和
>在AndroidManifest.xml文件中声明相关标签(例如WRITE_SECURE_SETTINGS等).

然后你可以这样做:

Settings.Global.putInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);

由于Settings.Global中定义的任何内容都可以由系统应用程序读写 – 甚至是作为系统应用程序创建的第三方应用程序.

标签:android,root,airplane
来源: https://codeday.me/bug/20190714/1459420.html