【问题标题】:how to implement feature like applock advance protection in my app如何在我的应用中实现 applock 高级保护等功能
【发布时间】:2016-05-11 22:15:03
【问题描述】:

我想使类似于android.app lock中的AppLock的应用程序具有停止卸载应用程序的高级保护功能。它可以在不root手机的情况下使用。 我一起尝试了几个小时,并尝试了很多来自 stackoverflow 的类似问题的解决方案,但无法解决。

在执行此操作时,我遇到了“设备管理员权限”。

  1. 我可以使用管理员权限做我想做的事吗?

  2. 如果不是 AppLock 高级保护的工作原理,我的意思是它如何限制用户卸载应用程序。

【问题讨论】:

  • 嗨,谢谢你的回复。我试过了,但我怎么能限制用户卸载应用程序。我的意思是如果可能的话,我可以取消卸载按钮,或者我可以提示密码屏幕当他/她打开应用程序设置菜单时。但设备管理员接收器在卸载应用程序后收到广播消息。
  • 有什么方法可以在卸载应用前获取广播消息?

标签: android


【解决方案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 应用程序设置策略,以防止卸载。

您还可以查看 OEM 提供的 MDM 解决方案。三星拥有非常强大的 API 来管理设备的各个方面-https://www.samsungknox.com/en/partners/mobile-device-managers

【讨论】:

  • 嗨。我已经浏览了你提供的链接。你的设备管理员有很高的权限,所以,如果我的应用程序是设备管理员,我可以实现我想要做的事情。“我有一个问题“每个设备只能有一个设备所有者应用程序......”?这是什么意思?我在手机中安装了多个具有相同功能的应用程序(阻止用户卸载)。如果是这样,那么 applocker 没有使用这个概念实现。我我说对了吗?
  • @TirupatiRao 设备所有者拥有比设备管理员更多的特权。您只能拥有一个设备所有者,但一台设备可以拥有多个配置文件所有者
  • 嗨,谢谢你,你说得对,我在文档中读到了这一点,但是管理员权限如何解决我阻止卸载的问题?
  • @TirupatiRao 您可以使用管理员/所有者应用程序设置策略,以防止卸载
  • .我应该设置什么政策,以便用户无法卸载应用程序?
【解决方案2】:

解决方案是使用:Device Administration 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() 方法来检索当前处于活动状态的所有管理员的列表。现在有趣的部分是,因为它返回一个列表;该列表中可能有多个设备管理员。所以最严格的政策仍然有效!

希望对你有帮助!

【讨论】:

猜你喜欢
  • 2020-04-08
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 2017-12-29
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多