Android NetworkSetting interruptor de menú de modo de red

El propósito de este artículo es que hemos establecido diferentes menús de red para diferentes operadores antes, por lo que si es necesario depurar o probar, el modo de red no puede mostrar todos los menús y no se puede modificar.

La política selinux antes de Android N no restringía el uso de SystemProperities.set () de priv-app. Podemos agregar directamente contraseñas digitales en Dialer y establecer diferentes valores de atributos persistentes para controlar si el menú muestra todo o mantiene la operación establecida Lista de cocientes.

Entonces, qué hacer en Android N, aunque el Marcador no puede hacer directamente este trabajo de atributos persistentes establecidos, luego pensar en otras formas, por lo que encontramos la configuración.
Primero, hablemos de la idea general:
1. Nuevo en la configuración Agregar un Fragmento independiente que hereda SettingsPreferenceFragment, el control principal es un interruptor SwitchPreference,
si el interruptor controla el valor del atributo persistente;
2. Por supuesto, el menú debe estar oculto al usuario y, finalmente, la contraseña del marcador debe usarse para comenzar; todo El proceso es así.

以上基本上就是在setting中新添模块的必经之路
具体实现:
1. AndroidMainfest.xml中注册
    <!--ShowAllNetworkModeSettings setting-->
    <activity android:name="Settings$ShowAllNetworkModeSettingsActivity"
      android:label="@string/open_all_network_mode_title"
      android:taskAffinity=""
      android:parentActivityName="Settings">
      <intent-filter android:priority="1">
                <action android:name="com.android.settings.action.SETTINGS" />
      </intent-filter>
      <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.DEFAULT" />
       </intent-filter>
            <intent-filter android:priority="10">
                <action android:name="com.android.settings.action.SETTINGS" />
            </intent-filter>
      <intent-filter>
          <action android:name="com.android.settings.show.network.mode.SHOW_ALL_NETWORK" />
          <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
            <!--------meta-data android:name="com.android.settings.category"
                android:value="com.android.settings.category.device" /------->
            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                android:value="com.android.settings.ShowAllNetworkModeSettings" />
            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                android:value="true" />
    <!--ShowAllNetworkModeSettings setting-->     

La parte de los comentarios del manifiesto anterior oculta el Fragmento actual para que no sea visible en la configuración.

A continuación se muestra el código java del nuevo Fragmento

packages\apps\Settings\src\com\android\settings\ShowAllNetworkModeSettings.java

package com.android.settings;

import android.app.Activity;
import android.os.Bundle;
import android.os.SystemProperties;
import com.android.settings.SettingsPreferenceFragment;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.preference.Preference.OnPreferenceClickListener;

import android.util.Log;


public class ShowAllNetworkModeSettings extends SettingsPreferenceFragment implements
	Preference.OnPreferenceClickListener {
    
    

    private static final String KEY_SHOW_ALL_NETWORK_MODE = "show_all_network_mode";
    private SwitchPreference mShowNetworkMode;

    public void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.show_network_mode);
        mShowNetworkMode = (SwitchPreference) findPreference(KEY_SHOW_ALL_NETWORK_MODE);
        mShowNetworkMode.setOnPreferenceClickListener(this);

    }

    public void onResume() {
    
    
        super.onResume();
        mShowNetworkMode.setChecked(SystemProperties.get("persist.sys.show.allnwmode", "no").equals("yes"));

    }

    public boolean onPreferenceClick(Preference preference) {
    
    
        if(preference == mShowNetworkMode) {
    
    
           SystemProperties.set("persist.sys.show.allnwmode", mShowNetworkMode.isChecked()? "yes":"no");

        }
        return false;

    }
    @Override
    protected int getMetricsCategory() {
    
    
        return 499;//replace id by number
    }

}

Adición de UI
Inserte la descripción de la imagen aquí

Agregando la relación de herencia que Fragment debe cumplir.
Inserte la descripción de la imagen aquí
Finalmente, Dialer agrega la contraseña. Intent inicia la actividad.
Inserte la descripción de la imagen aquí
De hecho, todo el proceso es agregar un nuevo menú Fragment en la configuración, pero este es un menú especial que debe estar oculto.

El registro anterior agrega proceso.

Supongo que te gusta

Origin blog.csdn.net/jeephao/article/details/103788256
Recomendado
Clasificación