当前位置: 首页 > article >正文

控制卸载/安装应用

这个是解决:开机默认状态不能卸载/安装应用,不能恢复出厂设置,
如果需要卸载/安装应用,和恢复出厂设置,则需要在设置-系统-关于平板-自定义版本点击5次,打开
输入密码28117three(弹出提示窗,请输入解锁密码),
同样自定义版本点击5次也要能关闭,也是同上步骤(弹出提示窗,请输入退出密码)
这个就是在安装或者卸载的时候去跳过那个流程

1、Settings.java

frameworks/base/core/java/android/provider/Settings.java
需要在这里加上一个属性,方便控制安装、卸载apk

         @Readable
         public static final String SCREEN_BRIGHTNESS = "screen_brightness";
+               
+               @Readable
+               @SuppressLint("NoSettingsProvider")
+        public static final String LOCK_INSTALL_APP = "lock_install_app";
+
 
         /**
          * The screen backlight brightness between 0.0f and 1.0f.

2、PackageInstallerActivity.java

frameworks/base/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
这个是判断有没有权限去安装

 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
-
+import android.widget.Toast;
 /**
  * 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.
@@ -517,6 +517,19 @@ public class PackageInstallerActivity extends AlertActivity {
      * Check if it is allowed to install the package and initiate install if allowed.
      */
     private void checkIfAllowedAndInitiateInstall() {
+               
+                if (Settings.System.getInt(getContentResolver(),
+                Settings.System.LOCK_INSTALL_APP, 0) == 0){
+                                        Log.w(TAG, "caninstall  false ="+mPkgInfo.applicationInfo.packageName);
+        if(mPkgInfo.applicationInfo.packageName != null ){
+            setPmResult(PackageManager.INSTALL_FAILED_INVALID_APK);
+            Toast.makeText(this, "install_failed", Toast.LENGTH_LONG).show();
+            finish();
+            return;
+        }
+                               }
+       
+               
         if (mAllowUnknownSources || !isInstallRequestFromUnknownSource(getIntent())) {
             if (mLocalLOGV) Log.i(TAG, "install allowed");
             initiateInstall();

// 这里就是把那个安装的流程给跳过了

3、UninstallFinish.java

frameworks/base/packages/PackageInstaller/src/com/android/packageinstaller/UninstallFinish.java

 public class UninstallFinish extends BroadcastReceiver {
     private static final String LOG_TAG = UninstallFinish.class.getSimpleName();
 
-    private static final String UNINSTALL_FAILURE_CHANNEL = "uninstall failure";
+     static final String UNINSTALL_FAILURE_CHANNEL = "uninstall failure";
 
     static final String EXTRA_UNINSTALL_ID = "com.android.packageinstaller.extra.UNINSTALL_ID";
     static final String EXTRA_APP_LABEL = "com.android.packageinstaller.extra.APP_LABEL";

4、UninstallerActivity.java

frameworks/base/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java
这个是卸载的时候也是采用跳过

 import com.android.packageinstaller.television.UninstallAppProgress;
 
 import java.util.List;
-
+import android.provider.Settings;
 /*
  * This activity presents UI to uninstall an application. Usually launched with intent
  * Intent.ACTION_UNINSTALL_PKG_COMMAND and attribute
@@ -344,6 +344,27 @@ public class UninstallerActivity extends Activity {
                     PendingIntent.getBroadcast(this, uninstallId, broadcastIntent,
                             PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
 
+ 
+                               if (Settings.System.getInt(getContentResolver(),
+                Settings.System.LOCK_INSTALL_APP, 0) == 0){
+                                       NotificationManager notificationManager =getSystemService(NotificationManager.class);
+
+        NotificationChannel uninstallFailureChannel = new NotificationChannel(
+               UninstallFinish.UNINSTALL_FAILURE_CHANNEL,
+                       getString(R.string.uninstall_failure_notification_channel),
+                NotificationManager.IMPORTANCE_DEFAULT);
+        notificationManager.createNotificationChannel(uninstallFailureChannel);
+
+        Notification.Builder uninstallFailedNotification = new Notification.Builder(this,
+                UninstallFinish.UNINSTALL_FAILURE_CHANNEL);
+                               
+                               uninstallFailedNotification.setContentTitle(getString(R.string.uninstall_failed_app, label));
+        uninstallFailedNotification.setOngoing(false);
+        uninstallFailedNotification.setSmallIcon(R.drawable.ic_error);
+        notificationManager.notify(uninstallId, uninstallFailedNotification.build());
+               finish();
+               return;
+                               }
             NotificationManager notificationManager = getSystemService(NotificationManager.class);
             NotificationChannel uninstallingChannel = new NotificationChannel(UNINSTALLING_CHANNEL,
                     getString(R.string.uninstalling_notification_channel),

5、defaults.xml

frameworks/base/packages/SettingsProvider/res/values/defaults.xml
这里是定义一个初始值
<integer name="def_lock_install_app">0</integer>
表示在最开始的时候也是不能安装apk和卸载apk的

6、DatabaseHelper.java

frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

初始值的设置

             loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
                     R.integer.def_screen_brightness);
 
+                       loadIntegerSetting(stmt, Settings.System.LOCK_INSTALL_APP,
+                    R.integer.def_lock_install_app);
             loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,
                     R.bool.def_screen_brightness_automatic_mode);

7、BuildNumberPreferenceController.java

packages/apps/Settings/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java

这里是开始去点击设置的版本号

 
 import com.android.settingslib.utils.StringUtil;
 import com.google.android.setupcompat.util.WizardManagerHelper;
-
+import android.content.DialogInterface;
+import androidx.appcompat.app.AlertDialog;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.EditText;
+import android.util.Log;
+import android.provider.Settings;
 public class BuildNumberPreferenceController extends BasePreferenceController implements
         LifecycleObserver, OnStart {
 
@@ -67,6 +73,7 @@ public class BuildNumberPreferenceController extends BasePreferenceController im
     private int mDevHitCountdown;
     private boolean mProcessingLastDevHit;
 
+       private EditText editText;
     public BuildNumberPreferenceController(Context context, String key) {
         super(context, key);
         mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
@@ -89,8 +96,7 @@ public class BuildNumberPreferenceController extends BasePreferenceController im
                 mContext, UserManager.DISALLOW_DEBUGGING_FEATURES, UserHandle.myUserId());
         mDebuggingFeaturesDisallowedBySystem = RestrictedLockUtilsInternal.hasBaseUserRestriction(
                 mContext, UserManager.DISALLOW_DEBUGGING_FEATURES, UserHandle.myUserId());
-        mDevHitCountdown = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext)
-                ? -1 : TAPS_TO_BE_A_DEVELOPER;
+        mDevHitCountdown =  TAPS_TO_BE_A_DEVELOPER;
         mDevHitToast = null;
     }
 
@@ -168,7 +174,8 @@ public class BuildNumberPreferenceController extends BasePreferenceController im
                         .show();
 
                 if (!mProcessingLastDevHit) {
-                    enableDevelopmentSettings();
+                                       unluckAlterDialog();
+                    //enableDevelopmentSettings();
                 }
                 mMetricsFeatureProvider.action(
                         mMetricsFeatureProvider.getAttribution(mActivity),
@@ -221,7 +228,8 @@ public class BuildNumberPreferenceController extends BasePreferenceController im
             return false;
         }
         if (resultCode == Activity.RESULT_OK) {
-            enableDevelopmentSettings();
+                       unluckAlterDialog();
+            //enableDevelopmentSettings();
         }
         mProcessingLastDevHit = false;
         return true;
@@ -231,7 +239,7 @@ public class BuildNumberPreferenceController extends BasePreferenceController im
      * Enables development settings. Only call this after confirming password.
      */
     private void enableDevelopmentSettings() {
-        mDevHitCountdown = 0;
+        mDevHitCountdown = TAPS_TO_BE_A_DEVELOPER;
         mProcessingLastDevHit = false;
         DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(mContext, true);
         if (mDevHitToast != null) {
@@ -248,4 +256,70 @@ public class BuildNumberPreferenceController extends BasePreferenceController im
     protected boolean isUserAMonkey() {
         return ActivityManager.isUserAMonkey();
     }
+       
+       private void unluckAlterDialog() {
+
+        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+        builder.setTitle("Input lock Password");
+        builder.setNegativeButton("ok", new DialogInterface.OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                String mPassword = editText.getText().toString();
+                               if(!TextUtils.isEmpty(mPassword)) {
+                Log.d("zmz-----", "text=" + mPassword);
+                if (mPassword.equals("28117three")) {
+                                       if (Settings.System.getInt(mContext.getContentResolver(),
+                Settings.System.LOCK_INSTALL_APP, 0) == 0){
+                                       Settings.System.putInt(mContext.getContentResolver(), Settings.System.LOCK_INSTALL_APP, 1);
+                                       enableDevelopmentSettings();
+                                       if (mDevHitToast != null) {
+                               mDevHitToast.cancel();
+                               }
+                               mDevHitToast = Toast.makeText(mContext, "unLock Password",
+                Toast.LENGTH_LONG);
+                               mDevHitToast.show();
+                               
+                               }else{
+                                       Settings.System.putInt(mContext.getContentResolver(), Settings.System.LOCK_INSTALL_APP, 0);
+                                       mDevHitCountdown = 7;
+                                       mProcessingLastDevHit = false;
+                                       DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(mContext, false);
+                                       if (mDevHitToast != null) {
+                               mDevHitToast.cancel();
+                               }
+                               mDevHitToast = Toast.makeText(mContext, "Lock Password",
+                Toast.LENGTH_LONG);
+                               mDevHitToast.show();
+                               
+                               }
+                
+                               
+                }else{
+                       if (mDevHitToast != null) {
+            mDevHitToast.cancel();
+        }
+                               mDevHitToast = Toast.makeText(mContext, "Password Error",
+                Toast.LENGTH_LONG);
+                               mDevHitToast.show();
+                               }
+                               }else{
+                                       if (mDevHitToast != null) {
+            mDevHitToast.cancel();
+        }
+                               mDevHitToast = Toast.makeText(mContext, "Password Error",
+                Toast.LENGTH_LONG);
+                               mDevHitToast.show();
+                               }
+            }
+        });
+        final AlertDialog dialog = builder.create();
+
+        View dialogView = View.inflate(mContext, R.layout.lock_input_password_dialog, null);
+        dialog.setView(dialogView);
+        dialog.show();
+        WindowManager.LayoutParams attrs = dialog.getWindow().getAttributes();
+        attrs.height = 310;
+        dialog.getWindow().setAttributes(attrs);
+        editText = dialog.findViewById(R.id.et_name);
+    }
 }

8、ResetPreferenceController.java

packages/apps/Settings/src/com/android/settings/system/ResetPreferenceController.java

 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.network.NetworkResetPreferenceController;
-
+import android.provider.Settings;
 public class ResetPreferenceController extends BasePreferenceController {
 
     private final UserManager mUm;
@@ -37,7 +37,16 @@ public class ResetPreferenceController extends BasePreferenceController {
 
     @Override
     public int getAvailabilityStatus() {
-        return mContext.getResources().getBoolean(R.bool.config_show_reset_dashboard)
-                ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+       // return mContext.getResources().getBoolean(R.bool.config_show_reset_dashboard)
+        //        ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+               /*if (Settings.System.getInt(mContext.getContentResolver(),
+                Settings.System.LOCK_INSTALL_APP, 0) == 0){
+                               return UNSUPPORTED_ON_DEVICE;   
+                               }else{
+                                       return AVAILABLE;
+                               }*/
+                               
+                               return Settings.System.getInt(mContext.getContentResolver(),
+                Settings.System.LOCK_INSTALL_APP, 0) == 1 ?  AVAILABLE : UNSUPPORTED_ON_DEVICE;
     }
 }

9、lock_input_password_dialog.xml

packages/apps/Settings/res/layout/lock_input_password_dialog.xml
弹窗的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="20dp"
        android:hint="Password:"
		android:singleLine="true"
        android:textSize="18sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dp"
        android:orientation="horizontal"
        android:paddingLeft="5dp"
        android:paddingRight="5dp">

    </LinearLayout>
</LinearLayout>

http://www.kler.cn/a/369708.html

相关文章:

  • 国产碳化硅(SiC)MOSFET模块在电镀电源中全面取代进口IGBT模块
  • 《多线程基础之互斥锁》
  • Rust:Rhai脚本编程示例
  • 使用 postman 测试思源笔记接口
  • WordPress event-monster插件存在信息泄露漏洞(CVE-2024-11396)
  • PostgreSQL 数据备份与恢复:掌握 pg_dump 和 pg_restore 的最佳实践
  • Chromium HTML5 新的 Input 类型date 对应c++
  • C++基于opencv的视频质量检测--画面冻结检测
  • Vue3中ref、toRef和toRefs之间有什么区别?
  • 基于SSM+微信小程序的快递的管理系统(快递1)
  • 基于脚手架创建前端工程
  • Linux 应用领域
  • 老电脑不能装纯净版windows
  • GEE APP:加载Landsat TOA数据可视化界面,实现点击提取ndvi值
  • 云原生后端开发教程
  • Python实现微博舆情分析的设计与实现
  • 存储服务器通常适用于哪些应用场景?
  • Spring版本有哪些
  • 回溯算法习题其二-Java【力扣】【算法学习day.16】
  • 外包功能测试就干了4周,技术退步太明显了。。。。。
  • 深入理解JavaScript:两大编程思想和ES6类以及对象概念解析
  • 100种算法【Python版】第17篇——Aho-Corasick算法
  • ELF文件格式解读及其生成过程(上)
  • Python 中的 object
  • React 前端框架开发入门案例
  • WebRTC VAD 详解与代码示例