未知来源应用禁止/允许开关
来源:互联网 发布:资料员学习软件 编辑:程序博客网 时间: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
- 未知来源应用禁止/允许开关
- 允许或禁止未知来源apk的安装
- Android系统设置settings应用学习(一)--允许未知来源应用安装
- USB调试】和【未知来源】开关
- 解决:在用户安装”未知来源“应用弹出对话框直接解除禁止,无需切换至设置页面进行勾选“未知来源“才能安装
- 允许任何来源应用运行
- Anroid8.0安装未知来源应用
- 升级10.12,想要允许任何来源应用
- MAC允许任何来源应用运行
- macOS 10.12 不允许未知来源开发者的应用
- Android中系统应用适配未知来源的管理权限
- [RK3288][Android6.0] 调试笔记 --- 默认允许安装未知来源apk
- MacOS Sierra找回允许下载“任何来源”的应用方法
- 苹果系统允许打开任何来源的应用
- android开启未知来源
- [来源未知]卡片游戏
- [来源未知]传送
- [来源未知]虚
- TProfiler部署文档--笔记
- Android:UI更新方法四:在Worker Thread中runOnUiThread直接刷新UI
- java websocket网页端客户端实现
- Toolbar
- 关于log4j的一些配置
- 未知来源应用禁止/允许开关
- netbeans 8.0.2 问题或做不到的事
- 从头认识Spring-1.3 Spring的容器与Bean
- Git 命令
- ngrok 反向代理
- 1031. 查验身份证(15)
- Spring ApplicationContextAware详解
- CListCtrl 虚拟列表技术
- 构建高性能web