未知来源应用禁止/允许开关

来源:互联网 发布:资料员学习软件 编辑:程序博客网 时间:2024/05/16 08:03

      最近在做一个在TV菜单里面加一个未知来源应用禁止/允许开关。Android原生系统的设置里面是有这个功能。仔细拜读了一下。做一个总结:

     packages\apps\PackageInstaller\src\com\android\packageinstaller\PackageInstallerActivity.java

import android.app.Activity;import android.app.ActivityManagerNative;import android.app.AlertDialog;import android.app.Dialog;import android.content.Context;import android.content.DialogInterface;import android.content.DialogInterface.OnCancelListener;import android.content.Intent;import android.content.SharedPreferences;import android.content.pm.ApplicationInfo;import android.content.pm.ManifestDigest;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.content.pm.PackageManager.NameNotFoundException;import android.content.pm.PackageParser;import android.content.pm.PackageUserState;import android.content.pm.ResolveInfo;import android.content.pm.VerificationParams;import android.net.Uri;import android.os.Bundle;import android.os.SystemClock;import android.provider.Settings;import android.support.v4.view.ViewPager;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.AppSecurityPermissions;import android.widget.Button;import android.widget.TabHost;import android.widget.TextView;import java.io.File;import java.util.List;/* * This activity is launched when a new application is installed via side loading * The package is first parsed and the user is notified of parse errors via a dialog. * If the package is successfully parsed, the user is notified to turn on the install unknown * applications setting. A memory check is made at this point and the user is notified of out * of memory conditions if any. If the package is already existing on the device,  * a confirmation dialog (to replace the existing package) is presented to the user. * Based on the user response the package is then installed by launching InstallAppConfirm * sub activity. All state transitions are handled in this activity */public class PackageInstallerActivity extends Activity implements OnCancelListener, OnClickListener {    private static final String TAG = "PackageInstaller";    private Uri mPackageURI;        private Uri mOriginatingURI;    private Uri mReferrerURI;    private int mOriginatingUid = VerificationParams.NO_UID;    private ManifestDigest mPkgDigest;    private boolean localLOGV = false;    PackageManager mPm;    PackageInfo mPkgInfo;    ApplicationInfo mSourceInfo;    // ApplicationInfo object primarily used for already existing applications    private ApplicationInfo mAppInfo = null;    private InstallFlowAnalytics mInstallFlowAnalytics;    // View for install progress    View mInstallConfirm;    // Buttons to indicate user acceptance    private Button mOk;    private Button mCancel;    CaffeinatedScrollView mScrollView = null;    private boolean mOkCanInstall = false;    static final String PREFS_ALLOWED_SOURCES = "allowed_sources";    private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";    private static final String TAB_ID_ALL = "all";    private static final String TAB_ID_NEW = "new";    // Dialog identifiers used in showDialog    private static final int DLG_BASE = 0;    private static final int DLG_UNKNOWN_APPS = DLG_BASE + 1;    private static final int DLG_PACKAGE_ERROR = DLG_BASE + 2;    private static final int DLG_OUT_OF_SPACE = DLG_BASE + 3;    private static final int DLG_INSTALL_ERROR = DLG_BASE + 4;    private static final int DLG_ALLOW_SOURCE = DLG_BASE + 5;    private void startInstallConfirm() {        TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);        tabHost.setup();        ViewPager viewPager = (ViewPager)findViewById(R.id.pager);        TabsAdapter adapter = new TabsAdapter(this, tabHost, viewPager);        adapter.setOnTabChangedListener(new TabHost.OnTabChangeListener() {            @Override            public void onTabChanged(String tabId) {                if (TAB_ID_ALL.equals(tabId)) {                    mInstallFlowAnalytics.setAllPermissionsDisplayed(true);                } else if (TAB_ID_NEW.equals(tabId)) {                    mInstallFlowAnalytics.setNewPermissionsDisplayed(true);                }            }        });        boolean permVisible = false;        mScrollView = null;        mOkCanInstall = false;        int msg = 0;        if (mPkgInfo != null) {            AppSecurityPermissions perms = new AppSecurityPermissions(this, mPkgInfo);            final int NP = perms.getPermissionCount(AppSecurityPermissions.WHICH_PERSONAL);            final int ND = perms.getPermissionCount(AppSecurityPermissions.WHICH_DEVICE);            if (mAppInfo != null) {                msg = (mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0                        ? R.string.install_confirm_question_update_system                        : R.string.install_confirm_question_update;                mScrollView = new CaffeinatedScrollView(this);                mScrollView.setFillViewport(true);                boolean newPermissionsFound =                        (perms.getPermissionCount(AppSecurityPermissions.WHICH_NEW) > 0);                mInstallFlowAnalytics.setNewPermissionsFound(newPermissionsFound);                if (newPermissionsFound) {                    permVisible = true;                    mScrollView.addView(perms.getPermissionsView(                            AppSecurityPermissions.WHICH_NEW));                } else {                    LayoutInflater inflater = (LayoutInflater)getSystemService(                            Context.LAYOUT_INFLATER_SERVICE);                    TextView label = (TextView)inflater.inflate(R.layout.label, null);                    label.setText(R.string.no_new_perms);                    mScrollView.addView(label);                }                adapter.addTab(tabHost.newTabSpec(TAB_ID_NEW).setIndicator(                        getText(R.string.newPerms)), mScrollView);            } else  {                findViewById(R.id.tabscontainer).setVisibility(View.GONE);                findViewById(R.id.divider).setVisibility(View.VISIBLE);            }            if (NP > 0 || ND > 0) {                permVisible = true;                LayoutInflater inflater = (LayoutInflater)getSystemService(                        Context.LAYOUT_INFLATER_SERVICE);                View root = inflater.inflate(R.layout.permissions_list, null);                if (mScrollView == null) {                    mScrollView = (CaffeinatedScrollView)root.findViewById(R.id.scrollview);                }                if (NP > 0) {                    ((ViewGroup)root.findViewById(R.id.privacylist)).addView(                            perms.getPermissionsView(AppSecurityPermissions.WHICH_PERSONAL));                } else {                    root.findViewById(R.id.privacylist).setVisibility(View.GONE);                }                if (ND > 0) {                    ((ViewGroup)root.findViewById(R.id.devicelist)).addView(                            perms.getPermissionsView(AppSecurityPermissions.WHICH_DEVICE));                } else {                    root.findViewById(R.id.devicelist).setVisibility(View.GONE);                }                adapter.addTab(tabHost.newTabSpec(TAB_ID_ALL).setIndicator(                        getText(R.string.allPerms)), root);            }        }        mInstallFlowAnalytics.setPermissionsDisplayed(permVisible);        if (!permVisible) {            if (mAppInfo != null) {                // This is an update to an application, but there are no                // permissions at all.                msg = (mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0                        ? R.string.install_confirm_question_update_system_no_perms                        : R.string.install_confirm_question_update_no_perms;            } else {                // This is a new application with no permissions.                msg = R.string.install_confirm_question_no_perms;            }            tabHost.setVisibility(View.GONE);            mInstallFlowAnalytics.setAllPermissionsDisplayed(false);            mInstallFlowAnalytics.setNewPermissionsDisplayed(false);            findViewById(R.id.filler).setVisibility(View.VISIBLE);            findViewById(R.id.divider).setVisibility(View.GONE);            mScrollView = null;        }        if (msg != 0) {            ((TextView)findViewById(R.id.install_confirm_question)).setText(msg);        }        mInstallConfirm.setVisibility(View.VISIBLE);        mOk = (Button)findViewById(R.id.ok_button);        mCancel = (Button)findViewById(R.id.cancel_button);        mOk.setOnClickListener(this);        mCancel.setOnClickListener(this);        if (mScrollView == null) {            // There is nothing to scroll view, so the ok button is immediately            // set to install.            mOk.setText(R.string.install);            mOkCanInstall = true;        } else {            mScrollView.setFullScrollAction(new Runnable() {                @Override                public void run() {                    mOk.setText(R.string.install);                    mOkCanInstall = true;                }            });        }    }    private void showDialogInner(int id) {        // TODO better fix for this? Remove dialog so that it gets created again        removeDialog(id);        showDialog(id);    }    @Override    public Dialog onCreateDialog(int id, Bundle bundle) { //zjg        switch (id) {        case DLG_UNKNOWN_APPS: <span style="color:#33cc00;">//这里是禁止安装后,弹出的对话框。</span>            return new AlertDialog.Builder(this)                    .setTitle(R.string.unknown_apps_dlg_title)                    .setMessage(R.string.unknown_apps_dlg_text)                    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {<span style="color:#33cc00;">//取消</span>                        public void onClick(DialogInterface dialog, int which) {                            Log.i(TAG, "Finishing off activity so that user can navigate to settings manually");                            finish();                        }})                    .setPositiveButton(R.string.not_allow, new DialogInterface.OnClickListener() {                        public void onClick(DialogInterface dialog, int which) { <span style="color:#33cc00;">//设置</span>                            Log.i(TAG, "Launching settings");                            launchSettingsAppAndFinish();                        }                    })                    .setOnCancelListener(this)                    .create();         case DLG_PACKAGE_ERROR :            return new AlertDialog.Builder(this)                    .setTitle(R.string.Parse_error_dlg_title)                    .setMessage(R.string.Parse_error_dlg_text)                    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {                        public void onClick(DialogInterface dialog, int which) {                            finish();                        }                    })                    .setOnCancelListener(this)                    .create();        case DLG_OUT_OF_SPACE:            // Guaranteed not to be null. will default to package name if not set by app            CharSequence appTitle = mPm.getApplicationLabel(mPkgInfo.applicationInfo);            String dlgText = getString(R.string.out_of_space_dlg_text,                     appTitle.toString());            return new AlertDialog.Builder(this)                    .setTitle(R.string.out_of_space_dlg_title)                    .setMessage(dlgText)                    .setPositiveButton(R.string.manage_applications, new DialogInterface.OnClickListener() {                        public void onClick(DialogInterface dialog, int which) {                            //launch manage applications                            Intent intent = new Intent("android.intent.action.MANAGE_PACKAGE_STORAGE");                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                            startActivity(intent);                               finish();                        }                    })                    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {                        public void onClick(DialogInterface dialog, int which) {                            Log.i(TAG, "Canceling installation");                            finish();                        }                  })                  .setOnCancelListener(this)                  .create();        case DLG_INSTALL_ERROR :            // Guaranteed not to be null. will default to package name if not set by app            CharSequence appTitle1 = mPm.getApplicationLabel(mPkgInfo.applicationInfo);            String dlgText1 = getString(R.string.install_failed_msg,                    appTitle1.toString());            return new AlertDialog.Builder(this)                    .setTitle(R.string.install_failed)                    .setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() {                        public void onClick(DialogInterface dialog, int which) {                            finish();                        }                    })                    .setMessage(dlgText1)                    .setOnCancelListener(this)                    .create();        case DLG_ALLOW_SOURCE:            CharSequence appTitle2 = mPm.getApplicationLabel(mSourceInfo);            String dlgText2 = getString(R.string.allow_source_dlg_text,                    appTitle2.toString());            return new AlertDialog.Builder(this)                    .setTitle(R.string.allow_source_dlg_title)                    .setMessage(dlgText2)                    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {                        public void onClick(DialogInterface dialog, int which) {                            setResult(RESULT_CANCELED);                            finish();                        }})                    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {                        public void onClick(DialogInterface dialog, int which) {                            SharedPreferences prefs = getSharedPreferences(PREFS_ALLOWED_SOURCES,                                    Context.MODE_PRIVATE);                            prefs.edit().putBoolean(mSourceInfo.packageName, true).apply();                            startInstallConfirm();                        }                    })                    .setOnCancelListener(this)                    .create();       }       return null;   }    private void launchSettingsAppAndFinish() {  <span style="color:#33cc00;">//此处则是跳转到设置的安全选项,去选择是否安装未知来源</span>        // Create an intent to launch SettingsTwo activity        Intent launchSettingsIntent = new Intent(Settings.ACTION_SECURITY_SETTINGS);        launchSettingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        startActivity(launchSettingsIntent);        finish();    }        private boolean <span style="background-color: rgb(255, 102, 0);">isInstallingUnknownAppsAllowed</span>() { <span style="color:#33cc00;">//获取数据库的初设值。如果是选中状态allow==1;即allow>0;</span>
<pre name="code" class="html">         int allow=Settings.Global.getInt(getContentResolver(),                               Settings.Global.INSTALL_NON_MARKET_APPS, 0)  

packages\apps\Settings\src\com\android\settings\SecuritySettings.java
import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;import android.app.Activity;import android.app.ActivityManager;import android.app.AlertDialog;import android.app.admin.DevicePolicyManager;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.PackageManager;import android.content.pm.ResolveInfo;import android.content.pm.UserInfo;import android.os.Bundle;import android.os.UserHandle;import android.os.UserManager;import android.preference.CheckBoxPreference;import android.preference.ListPreference;import android.preference.Preference;import android.preference.Preference.OnPreferenceChangeListener;import android.preference.PreferenceGroup;import android.preference.PreferenceScreen;import android.provider.Settings;import android.security.KeyStore;import android.telephony.TelephonyManager;import android.util.Log;import com.android.internal.widget.LockPatternUtils;import java.util.ArrayList;import java.util.List;/** * Gesture lock pattern settings. */public class SecuritySettings extends RestrictedSettingsFragment        implements OnPreferenceChangeListener, DialogInterface.OnClickListener {    static final String TAG = "SecuritySettings";    // Lock Settings    private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change";    private static final String KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING =            "biometric_weak_improve_matching";    private static final String KEY_BIOMETRIC_WEAK_LIVELINESS = "biometric_weak_liveliness";    private static final String KEY_LOCK_ENABLED = "lockenabled";    private static final String KEY_VISIBLE_PATTERN = "visiblepattern";    private static final String KEY_SECURITY_CATEGORY = "security_category";    private static final String KEY_DEVICE_ADMIN_CATEGORY = "device_admin_category";    private static final String KEY_LOCK_AFTER_TIMEOUT = "lock_after_timeout";    private static final String KEY_OWNER_INFO_SETTINGS = "owner_info_settings";    private static final String KEY_ENABLE_WIDGETS = "keyguard_enable_widgets";    private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;    private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST = 124;    private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF = 125;    // Misc Settings    private static final String KEY_SIM_LOCK = "sim_lock";    private static final String KEY_SHOW_PASSWORD = "show_password";    private static final String KEY_CREDENTIAL_STORAGE_TYPE = "credential_storage_type";    private static final String KEY_RESET_CREDENTIALS = "reset_credentials";    private static final String KEY_CREDENTIALS_INSTALL = "credentials_install";    private static final String KEY_TOGGLE_INSTALL_APPLICATIONS = "toggle_install_applications";    private static final String KEY_TOGGLE_VERIFY_APPLICATIONS = "toggle_verify_applications";    private static final String KEY_POWER_INSTANTLY_LOCKS = "power_button_instantly_locks";    private static final String KEY_CREDENTIALS_MANAGER = "credentials_management";    private static final String KEY_NOTIFICATION_ACCESS = "manage_notification_access";    private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";    private PackageManager mPM;    private DevicePolicyManager mDPM;    private ChooseLockSettingsHelper mChooseLockSettingsHelper;    private LockPatternUtils mLockPatternUtils;    private ListPreference mLockAfter;    private CheckBoxPreference mBiometricWeakLiveliness;    private CheckBoxPreference mVisiblePattern;    private CheckBoxPreference mShowPassword;    private KeyStore mKeyStore;    private Preference mResetCredentials;    private CheckBoxPreference mToggleAppInstallation;    private DialogInterface mWarnInstallApps;    private CheckBoxPreference mToggleVerifyApps;    private CheckBoxPreference mPowerButtonInstantlyLocks;    private CheckBoxPreference mEnableKeyguardWidgets;    private Preference mNotificationAccess;    private boolean mIsPrimary;    public SecuritySettings() {        super(null /* Don't ask for restrictions pin on creation. */);    }    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mLockPatternUtils = new LockPatternUtils(getActivity());        mPM = getActivity().getPackageManager();        mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());    }    private PreferenceScreen createPreferenceHierarchy() {        PreferenceScreen root = getPreferenceScreen();        if (root != null) {            root.removeAll();        }        addPreferencesFromResource(R.xml.security_settings);        root = getPreferenceScreen();        // Add options for lock/unlock screen        int resid = 0;        if (!mLockPatternUtils.isSecure()) {            // if there are multiple users, disable "None" setting            UserManager mUm = (UserManager) getSystemService(Context.USER_SERVICE);            List<UserInfo> users = mUm.getUsers(true);            final boolean singleUser = users.size() == 1;            if (singleUser && mLockPatternUtils.isLockScreenDisabled()) {                resid = R.xml.security_settings_lockscreen;            } else {                resid = R.xml.security_settings_chooser;            }        } else if (mLockPatternUtils.usingBiometricWeak() &&                mLockPatternUtils.isBiometricWeakInstalled()) {            resid = R.xml.security_settings_biometric_weak;        } else {            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) {                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:                    resid = R.xml.security_settings_pattern;                    break;                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:                    resid = R.xml.security_settings_pin;                    break;                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:                    resid = R.xml.security_settings_password;                    break;            }        }        addPreferencesFromResource(resid);        // Add options for device encryption        mIsPrimary = UserHandle.myUserId() == UserHandle.USER_OWNER;        if (!mIsPrimary) {            // Rename owner info settings            Preference ownerInfoPref = findPreference(KEY_OWNER_INFO_SETTINGS);            if (ownerInfoPref != null) {                if (UserManager.get(getActivity()).isLinkedUser()) {                    ownerInfoPref.setTitle(R.string.profile_info_settings_title);                } else {                    ownerInfoPref.setTitle(R.string.user_info_settings_title);                }            }        }        if (mIsPrimary) {            switch (mDPM.getStorageEncryptionStatus()) {            case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE:                // The device is currently encrypted.                addPreferencesFromResource(R.xml.security_settings_encrypted);                break;            case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE:                // This device supports encryption but isn't encrypted.                addPreferencesFromResource(R.xml.security_settings_unencrypted);                break;            }        }        // lock after preference        mLockAfter = (ListPreference) root.findPreference(KEY_LOCK_AFTER_TIMEOUT);        if (mLockAfter != null) {            setupLockAfterPreference();            updateLockAfterPreferenceSummary();        }        // biometric weak liveliness        mBiometricWeakLiveliness =                (CheckBoxPreference) root.findPreference(KEY_BIOMETRIC_WEAK_LIVELINESS);        // visible pattern        mVisiblePattern = (CheckBoxPreference) root.findPreference(KEY_VISIBLE_PATTERN);        // lock instantly on power key press        mPowerButtonInstantlyLocks = (CheckBoxPreference) root.findPreference(                KEY_POWER_INSTANTLY_LOCKS);        // don't display visible pattern if biometric and backup is not pattern        if (resid == R.xml.security_settings_biometric_weak &&                mLockPatternUtils.getKeyguardStoredPasswordQuality() !=                DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {            PreferenceGroup securityCategory = (PreferenceGroup)                    root.findPreference(KEY_SECURITY_CATEGORY);            if (securityCategory != null && mVisiblePattern != null) {                securityCategory.removePreference(root.findPreference(KEY_VISIBLE_PATTERN));            }        }        // Append the rest of the settings        addPreferencesFromResource(R.xml.security_settings_misc);        // Do not display SIM lock for devices without an Icc card        TelephonyManager tm = TelephonyManager.getDefault();        if (!mIsPrimary || !tm.hasIccCard()) {            root.removePreference(root.findPreference(KEY_SIM_LOCK));        } else {            // Disable SIM lock if sim card is missing or unknown            if ((TelephonyManager.getDefault().getSimState() ==                                 TelephonyManager.SIM_STATE_ABSENT) ||                (TelephonyManager.getDefault().getSimState() ==                                 TelephonyManager.SIM_STATE_UNKNOWN)) {                root.findPreference(KEY_SIM_LOCK).setEnabled(false);            }        }        // Enable or disable keyguard widget checkbox based on DPM state        mEnableKeyguardWidgets = (CheckBoxPreference) root.findPreference(KEY_ENABLE_WIDGETS);        if (mEnableKeyguardWidgets != null) {            if (ActivityManager.isLowRamDeviceStatic()                    || mLockPatternUtils.isLockScreenDisabled()) {                // Widgets take a lot of RAM, so disable them on low-memory devices                PreferenceGroup securityCategory                        = (PreferenceGroup) root.findPreference(KEY_SECURITY_CATEGORY);                if (securityCategory != null) {                    securityCategory.removePreference(root.findPreference(KEY_ENABLE_WIDGETS));                    mEnableKeyguardWidgets = null;                }            } else {                final boolean disabled = (0 != (mDPM.getKeyguardDisabledFeatures(null)                        & DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL));                if (disabled) {                    mEnableKeyguardWidgets.setSummary(                            R.string.security_enable_widgets_disabled_summary);                } else {                    mEnableKeyguardWidgets.setSummary("");                }                mEnableKeyguardWidgets.setEnabled(!disabled);            }        }        // Show password        mShowPassword = (CheckBoxPreference) root.findPreference(KEY_SHOW_PASSWORD);        mResetCredentials = root.findPreference(KEY_RESET_CREDENTIALS);        // Credential storage        final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);        mKeyStore = KeyStore.getInstance(); // needs to be initialized for onResume()        if (!um.hasUserRestriction(UserManager.DISALLOW_CONFIG_CREDENTIALS)) {            Preference credentialStorageType = root.findPreference(KEY_CREDENTIAL_STORAGE_TYPE);            final int storageSummaryRes =                mKeyStore.isHardwareBacked() ? R.string.credential_storage_type_hardware                        : R.string.credential_storage_type_software;            credentialStorageType.setSummary(storageSummaryRes);        } else {            removePreference(KEY_CREDENTIALS_MANAGER);        }        // Application install    //这块主要是“未知来源的设置”是否勾选        PreferenceGroup deviceAdminCategory= (PreferenceGroup)                root.findPreference(KEY_DEVICE_ADMIN_CATEGORY);        mToggleAppInstallation = (CheckBoxPreference) findPreference(                KEY_TOGGLE_INSTALL_APPLICATIONS);        mToggleAppInstallation.setChecked(isNonMarketAppsAllowed());<span style="color:#33cc00;">//<span style="font-family: Arial, Helvetica, sans-serif;">isNonMarketAppsAllowed()方法主要是获取Android设置数据库的参数来判断是否勾选上。</span></span>        // Side loading of apps.        mToggleAppInstallation.setEnabled(mIsPrimary);        // Package verification, only visible to primary user and if enabled        mToggleVerifyApps = (CheckBoxPreference) findPreference(KEY_TOGGLE_VERIFY_APPLICATIONS);        if (mIsPrimary && showVerifierSetting()) {            if (isVerifierInstalled()) {                mToggleVerifyApps.setChecked(isVerifyAppsEnabled());            } else {                mToggleVerifyApps.setChecked(false);                mToggleVerifyApps.setEnabled(false);            }        } else {            if (deviceAdminCategory != null) {                deviceAdminCategory.removePreference(mToggleVerifyApps);            } else {                mToggleVerifyApps.setEnabled(false);            }        }        mNotificationAccess = findPreference(KEY_NOTIFICATION_ACCESS);        if (mNotificationAccess != null) {            final int total = NotificationAccessSettings.getListenersCount(mPM);            if (total == 0) {                if (deviceAdminCategory != null) {                    deviceAdminCategory.removePreference(mNotificationAccess);                }            } else {                final int n = getNumEnabledNotificationListeners();                if (n == 0) {                    mNotificationAccess.setSummary(getResources().getString(                            R.string.manage_notification_access_summary_zero));                } else {                    mNotificationAccess.setSummary(String.format(getResources().getQuantityString(                            R.plurals.manage_notification_access_summary_nonzero,                            n, n)));                }            }        }        if (shouldBePinProtected(RESTRICTIONS_PIN_SET)) {            protectByRestrictions(mToggleAppInstallation);            protectByRestrictions(mToggleVerifyApps);            protectByRestrictions(mResetCredentials);            protectByRestrictions(root.findPreference(KEY_CREDENTIALS_INSTALL));        }        return root;    }    private int <span style="background-color: rgb(255, 102, 0);">getNumEnabledNotificationListeners</span>() {        final String flat = Settings.Secure.getString(getContentResolver(),                Settings.Secure.ENABLED_NOTIFICATION_LISTENERS);        if (flat == null || "".equals(flat)) return 0;        final String[] components = flat.split(":");        return components.length;    }    private boolean <span style="background-color: rgb(255, 102, 0);">isNonMarketAppsAllowed</span>() {  <span style="color:#33cc00;">//getInt()时,通过内容解析器解析数据库对应的内容。</span>        return Settings.Global.getInt(getContentResolver(),                                      Settings.Global.INSTALL_NON_MARKET_APPS, 0) > 0;    }    private void <span style="background-color: rgb(255, 102, 0);">setNonMarketAppsAllowed</span>(boolean enabled) {  //putInt(),设置对应的勾选状态(用户操作产生)        final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);        if (um.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES)) {            return;        }        // Change the system setting        Settings.Global.putInt(getContentResolver(), Settings.Global.INSTALL_NON_MARKET_APPS,                                enabled ? 1 : 0);<span style="color:#33cc00;">//如果<span style="font-family: Arial, Helvetica, sans-serif;">setNonMarketAppsAllowed(true);则表示“允许安装”;若</span></span>
<pre name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="color:#33cc00;">setNonMarketAppsAllowed(false);则表示“禁止安装”。</span> 即:<span style="color:#ff0000;">1表示允许。0表示禁止</span>。</span>

0 0
原创粉丝点击