如何禁用AIRPLANE MODE数位板支持4.4.2

时间:2014-10-14 09:16:36

标签: android android-manifest intentfilter airplane android-settings

我必须在我的应用中停用 AIRPLANE MODEDATE TIME SETTINGS,因为我使用了这些意图过滤器但是none他们works对我来说

        <uses-permission android:name="android.permission.WRITE_SETTINGS" />

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.HOME" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter>
           <action android:name="android.settings.AIRPLANE_MODE_SETTINGS" />
           <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

        <intent-filter>
           <action android:name="android.settings.DATE_SETTINGS" />
           <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

但早些时候我使用Settings以下

成功停用了 intent-filter
        <intent-filter >
            <action android:name="android.settings.SETTINGS" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

2 个答案:

答案 0 :(得分:4)

对于版本4.2及更高版本,您无法以编程方式控制飞行模式。

只有当用户拥有有根设备时,您才能这样做。

如API DOC中所述:

“Settings.System定义的某些设备设置现在为read-only。如果您的应用尝试将更改设置为已移至Settings.Global的Settings.System中定义的设置,则写入操作在Android 4.2及更高版本上运行时会无声地失败。 即使您android:targetSdkVersionandroid:minSdkVersion的值低于17,您的应用也无法修改在{{1}上运行时已移至Settings.Global的设置而且更高。“

答案 1 :(得分:2)

TLDR:不要这样做。

想想如果用户无法启用飞行模式会发生什么,如果他们想要/应该 无法从您的应用更改重要的系统设置。

我建议:

  1. 检查飞行模式是否已禁用
  2. 如果启用,则提示“此应用程序无法在飞行模式下运行。打开系统设置应用程序?”使用“是/取消”对话框
  3. 关闭您的应用和/或打开系统设置应用
  4. 修改 它看起来像这样:

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    private void checkAirplaneMode() {
        int mode;
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            Log.v(TAG, "work with new api.");
            mode = Settings.Global.getInt(getActivity().getContentResolver(),
                    Settings.Global.AIRPLANE_MODE_ON, 0);
        } else {
            Log.v(TAG, "work with old api.");
            mode = Settings.System.getInt(getActivity().getContentResolver(),
                    Settings.System.AIRPLANE_MODE_ON, 0);
        }
        Log.v(TAG, "airplane mode: " + mode);
    
        if(mode == 1 /* airplane mode is on */) {
            new AlertDialog.Builder(getActivity()).setTitle("Sorry!")
                    .setMessage("This app doesn't work with Airplane mode.\n"
                            + "Please disable Airplane mode.\n")
                    .setPositiveButton("Open Settings", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            startActivity(new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS));
                            getActivity().finish();
                        }
                    })
                    .setNegativeButton("Close app", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            getActivity().finish();
                        }
                    })
                    .show();
        }
    }
    

    这里有一点。

    • 检查Build.VERSION.SDK_INT以使用Settings.Global获取更新的设备。飞机模式移至此处。
    • 如果mode == 1,则设备处于飞行模式。
    • 打开飞机模式设置活动 startActivity(new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS));