如何在android中使我的应用程序设备管理员?

Posted

技术标签:

【中文标题】如何在android中使我的应用程序设备管理员?【英文标题】:how to make my application device administrator in android? 【发布时间】:2012-06-15 05:04:14 【问题描述】:

我正在尝试让我的应用程序设备管理员,我遵循了相同的一些注释 Device admin SAMPLE notes 或 TUTORIAL here 但仍然无法实现。

谁能指出一个相同的工作示例,我只需要确保要卸载应用程序,用户需要输入我的应用程序中设置的密码。

任何帮助都会很有用,在此先感谢

【问题讨论】:

如果您不允许删除它,这听起来更像是恶意软件而不是有用的应用程序,对吧? 基本上就像一个家长控制,所以孩子不能删除应用程序,除非家长输入密码。 【参考方案1】:

我只需要确保要卸载应用程序,用户需要输入在我的应用程序中设置的密码。

幸运的是,这对于 SDK 应用程序是不可能的。即使是设备管理应用程序也无法阻止用户卸载它。

【讨论】:

Cerberus 应用程序成功了。该应用程序是设备管理员,如果用户未选中菜单中的选项,他将无法卸载该应用程序。如何做到这一点? @GabrielAugusto:感谢您指出 android 安全漏洞。我将尝试确认您的发现,然后与 Android 安全团队合作纠正此缺陷。 @CommonsWare:您提到过 SDK 应用程序是不可能的。那么,系统应用程序可以吗?我可以创建一个受密码保护且用户无法卸载的系统应用程序吗? @user1010:如果是系统应用,用户不能卸载它,除非有root用户。 哦,是的,我怎么能忘记这一点。【参考方案2】:

我找到了示例教程here。希望对你有帮助。

警告 :::: 如果您点击“重置设备”,您的设备将恢复出厂设置,因为

devicePolicyManager.wipeData(ACTIVATION_REQUEST);

【讨论】:

【参考方案3】:

您不能以编程方式激活它,但您可以要求用户在运行时启用它 这是完整的解决方案

 var devicePolicyManager: DevicePolicyManager? = null
    var deviceAdmin: ComponentName? = null

在需要时在 oncreate 中调用此方法

//调用此方法检查是否启用

checkAndTakeUserToEnableEnableAdminApp()



private fun checkAndTakeUserToEnableEnableAdminApp() 
        devicePolicyManager = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
        deviceAdmin = ComponentName(this, DeviceAdminReceiverClass::class.java)
        if (devicePolicyManager!!.isAdminActive(deviceAdmin!!)) 
        //do whatever is needed here is its active
         else 
            showDeviceAdminPopup(this)
        

    

在哪里DeviceAdminReceiverClass

import android.app.admin.DeviceAdminReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;



/**
 * This is the component that is responsible for actual device administration.
 * It becomes the receiver when a policy is applied. It is important that we
 * subclass DeviceAdminReceiverClass class here and to implement its only required
 * method onEnabled().
 */
public class DeviceAdminReceiverClass extends DeviceAdminReceiver 
    static final String TAG = "DeviceAdminReceiverClass";

    /** Called when this application is approved to be a device administrator. */
    @Override
    public void onEnabled(Context context, Intent intent) 
        super.onEnabled(context, intent);
        Toast.makeText(context, "Device admin is enabled",
                Toast.LENGTH_LONG).show();
        Log.d(TAG, "onEnabled");
    

    /** Called when this application is no longer the device administrator. */
    @Override
    public void onDisabled(Context context, Intent intent) 
        super.onDisabled(context, intent);
        Toast.makeText(context, "Device admin is disabled",
                Toast.LENGTH_LONG).show();
        Log.d(TAG, "onDisabled");
    

    @Override
    public void onPasswordChanged(Context context, Intent intent) 
        super.onPasswordChanged(context, intent);
        Log.d(TAG, "onPasswordChanged");
    

    @Override
    public void onPasswordFailed(Context context, Intent intent) 
        super.onPasswordFailed(context, intent);
        Log.d(TAG, "onPasswordFailed");
    

    @Override
    public void onPasswordSucceeded(Context context, Intent intent) 
        super.onPasswordSucceeded(context, intent);
        Log.d(TAG, "onPasswordSucceeded");
    


清单

<receiver
            android:name=".DeviceAdminReceiverClass"
            android:permission="android.permission.BIND_DEVICE_ADMIN" >
            <intent-filter>

                <!-- This action is required -->
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>

            <!-- This is required this receiver to become device admin component. -->
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin" />
        </receiver>

@xml/device_admin

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->
<device-admin xmlns:android="http://schemas.android.com/apk/res/android"
    android:visible="false">
    <uses-policies>
        <watch-login />
        <force-lock />
    </uses-policies>
</device-admin>

【讨论】:

以上是关于如何在android中使我的应用程序设备管理员?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中使我的单选按钮完全填充活动颜色的颜色而没有白色边框?

Android 如何在 Nexus 中使状态和工具栏透明

如何在android中使底部导航栏不透明?

如何使我的应用程序对所有设备可见?

如何仅使用主 git 分支在 Jenkins 中使我的项目自动从开发部署到登台并手动部署到生产

广播接收器在某些设备中使应用程序崩溃