我想实现AppLock应用程序正在做的事情。
如果在其设置中将其设置为锁定应用程序卸载/安装,则在卸载任何应用程序时(正好在单击卸载按钮时)会出现一个锁定屏幕,要求输入密码/模式。
只有在输入密码后,才允许用户卸载该应用程序。
当点击卸载按钮时会得到什么意图(或任何事情,我认为这是一个意图但不确定)?
另外我不想让它成为设备管理员,因为我提到的应用程序确实需要设备管理员。
如果他们可以做到,那么有一些方法。
请帮忙。
答案 0 :(得分:2)
我找到了办法。
当您转到设置 - > 管理应用 - > 点击任意应用。
你会得到一个带有附加名称的广播。
当您点击该屏幕上的卸载按钮时,
一个活动打开,请始终命名为 com.android.uninstaller.UnistallerActivity
。
因此,该问题的解决方案是上述1步和2步的组合方式。
当您获得第一步中提到的意图并且附加内容包含应用程序的包名称时,使用PackageManager
启动活动监视器,通过该活动监视器获得最顶级的活动及其包。
所以现在如果启动了卸载程序活动,那么您可以确定用户想要卸载您的应用程序。
在你做完必要的行动以阻止他这样做之后。
答案 1 :(得分:0)
改为使其成为设备管理员。这将自动阻止用户卸载它。如果用户尝试从安全>停用它;设备管理员列表为了卸载它,您的应用程序可以要求输入密码。
答案 2 :(得分:0)
您可以拦截应用程序卸载的意图。只需将以下代码放入清单文件中即可:
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".UninstallActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.DELETE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="package" android:pathPattern="com.package.yourapp" />
</intent-filter>
</activity>
</application>
在此之后,您可以以某种方式处理您的应用程序将被删除,并调用包管理器卸载程序。
答案 3 :(得分:0)
尝试在广播接收器中捕获以下意图并启动您的活动警告活动或处理您想要继续进行的操作。
“android.intent.action.UNINSTALL_PACKAGE”
此意图不会被提供或广播到即将卸载的同一个应用
答案 4 :(得分:0)
看起来这已经经历了很多变化。 PACKAGE_REMOVED
的默认广播无法按预期工作。我遇到了这个讨论,实际上没有实现它,但人们说它对他们有用。试一试
https://groups.google.com/forum/?fromgroups=#!topic/android-developers/aX5-fMbdPR8
答案 5 :(得分:0)
试试这段代码
请尝试通过ActivityManager获取任务中的热门活动,并检查它是否为卸载活动。
ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity;
String packageName = topActivity.getPackageName();
String className = topActivity.getClassName();
Log.v(TAG, "packageName" + packageName);
Log.v(TAG, "className" + className);
if ("com.android.packageinstaller".equals(packageName)
&& "com.android.packageinstaller.UninstallerActivity".equals(className)) {
//Do anything you want here
}