我想让android.app lock
中类似于 AppLock 的应用程序具有提前保护功能,该功能可以停止卸载应用程序。它可以解除手机的生根问题。
我一起尝试了几个小时,尝试了很多来自stackoverflow的类似问题的解决方案,但无法通过它。
在执行此操作时,我遇到了“设备管理员权限”。
我可以使用管理员权限做我想做的事。
如果不是 AppLock 预先保护的方式,我的意思是如何限制用户卸载应用程序。
答案 0 :(得分:1)
您需要将您的应用设为设备所有者 - 它具有比设备管理应用更高的权限。
有关详细信息,请参阅 - http://florent-dupont.blogspot.com/2015/02/10-things-to-know-about-device-owner.html和此处https://source.android.com/devices/tech/admin/provision.html
您可以使用admins / owner app设置策略,以防止卸载。
您还可以查看OEM提供的MDM解决方案。三星拥有非常强大的API来管理设备的各个方面 - https://www.samsungknox.com/en/partners/mobile-device-managers
答案 1 :(得分:0)
解决方案是使用:设备管理API
设备管理API专为企业应用程序设计。此API在系统级别提供管理功能。
所以它是如何运作的?
您可以使用设备管理API编写用户在其设备上安装的设备管理应用程序。设备管理应用程序强制执行所需的策略。以下是它的工作原理:
如果用户未启用设备管理应用程序,它将保留在设备上,但处于非活动状态。用户不会受其政策约束,反过来也不会获得任何应用程序的好处 - 例如,他们可能无法同步数据。
如果用户未能遵守这些策略(例如,如果用户设置了违反指南的密码),则应由应用程序决定如何处理此问题。但是,通常这会导致用户无法同步数据。
如果设备尝试连接到需要设备管理API不支持的策略的服务器,则不允许连接。设备管理API当前不允许部分配置。换句话说,如果设备(例如,旧设备)不支持所有规定的策略,则无法允许设备连接。
如果设备包含多个已启用的管理应用程序,则会强制执行最严格的策略。无法定位特定的管理应用程序。
要卸载现有设备管理应用程序,用户需要先以管理员身份取消注册该应用程序。
以下是实现相同的示例代码:
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
public class ActiveDevicePolicy extends Activity {
private DevicePolicyManager activeDevicePolicyManager;
private final String LOG_TAG = "ActiveDevicePolicy";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_active_device_policy);
activeDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
List<ComponentName> activeAdmins = activeDevicePolicyManager.getActiveAdmins();
if(activeAdmins != null && !activeAdmins.isEmpty()){
for(int index = 0; index < activeAdmins.size(); index++ ){
Log.i(LOG_TAG, "flattenToShortString: "+ activeAdmins.get(index).flattenToShortString());
Log.i(LOG_TAG, "flattenToString: "+ activeAdmins.get(index).flattenToString());
Log.i(LOG_TAG, "getClassName: "+ activeAdmins.get(index).getClassName());
Log.i(LOG_TAG, "getPackageName: "+ activeAdmins.get(index).getPackageName());
Log.i(LOG_TAG, "getShortClassName: "+ activeAdmins.get(index).getShortClassName());
Log.i(LOG_TAG, "toShortString: "+ activeAdmins.get(index).toShortString());
}
} else {
Log.i(LOG_TAG, "No Active Device Policy Manager");
}
}
}
在上面的代码中,我调用了DevicePolicyManager.getActiveAdmins()
方法来检索当前处于活动状态的所有管理员的列表。现在有趣的部分是,因为它返回一个列表;该列表中可能有多个设备管理员。所以最严格的政策仍然活跃!
希望它有所帮助!