未知管理员:ComponentInfo - 尝试为生产 Android 设备启用 kiosk 模式?

2023-12-20

我正在尝试为我的设备启用信息亭模式,但收到未知的管理错误。我很确定我成功地将我的应用程序设置为设备所有者,并且我认为这是最后一步,但这个错误给我带来了很多麻烦。

清单 - 我这里有一个接收器,应该将我的应用程序绑定为设备管理员。它还引用了 device_admin.xml ,我不完全确定我需要它;我通过 root 并将 device_owner.xml 放入 /data/system 来使我的设备成为设备所有者。这与设备管理不同吗?device_admin.xml 是必需的吗?

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <receiver
            android:name="com.example.setupmanager.AdminReceiver"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_DEVICE_ADMIN">

            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin" />

            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>

        </receiver>

        ...

    </application>

AdminReceiver - 在当前状态下永远不会被调用。我认为它应该,但它似乎没有被正确创建。

    public class AdminReceiver extends DeviceAdminReceiver {

        @Override
        public void onEnabled(Context context, Intent intent) {
            Log.v(TAG, "Device Admin Enabled");
            Toast.makeText(context, context.getString(R.string.device_admin_enabled), Toast.LENGTH_SHORT).show();
        }

        @Override
        public CharSequence onDisableRequested(Context context, Intent intent) {
            return context.getString(R.string.device_admin_warning);
        }

        @Override
        public void onDisabled(Context context, Intent intent) {
            Log.v(TAG, "device admin disabled");
            Toast.makeText(context, context.getString(R.string.device_admin_disabled), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onLockTaskModeEntering(Context context, Intent intent, String pkg) {
            Log.v(TAG, "kiosk mode enabled");

            Toast.makeText(context, context.getString(R.string.kiosk_mode_enabled), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onLockTaskModeExiting(Context context, Intent intent) {
            Log.v(TAG, "kiosk mode disabled");

            Toast.makeText(context, context.getString(R.string.kiosk_mode_disabled), Toast.LENGTH_SHORT).show();
        }

    }

device_admin.xml - 这只是一个空白的 xml 文件。同样,我不确定我是否需要它,或者它的用途是什么。

    <device-admin xmlns:android="http://schemas.android.com/apk/res/android">

    </device-admin>

MainActivity.java - OnCreate - 这是我尝试将它们连接在一起的地方。从我收到的日志消息来看(精简):

com.example.setupmanager/.AdminReceiver

不是设备管理员

差不多了...

D/AndroidRuntime:关闭虚拟机

E/AndroidRuntime:致命异常:main java.lang.RuntimeException:无法启动活动

java.lang.SecurityException:没有活动管理组件信息{com.example.setupmanager/com.example.setupmanager.AdminReceiver}

看来我是设备所有者,但 ComponentName 设备管理未从 AdminReceiver 类成功创建。

    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

    if (deviceAdmin == null)
        Log.v(TAG, "No device admin exists");
    else
        Log.v(TAG, deviceAdmin.flattenToShortString());

    if (!mDpm.isAdminActive(deviceAdmin)) {
        Log.v(TAG, "Not device admin");
        Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show();
    }

    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        Log.v(TAG, "Almost there...");
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    } else {
        Log.v(TAG, "Not device owner");
        Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show();
    } 

我做错了什么,我还应该提供更多信息/采取步骤吗?我的设备版本是5.0.2。

Edit:

当我在连接到我的设备的终端中输入: dpm 设置设备所有者 com.example.setupmanager/MyAdmin

我收到错误: 错误:未知管理员:ComponentInfo{com.example.setupmanager/MyAdmin}

...这就是为什么我选择 root -> move device_owner.xml to /data/system 方法来使我的应用程序成为设备所有者。我不确定无法通过终端管理我的设备是否与此问题有关。


我认为您分配设备管理器的命令是错误的 尝试

adb shell dpm set-device-owner com.example.setupmanager/.AdminReceiver

这是根据谷歌代码实验室教程 https://codelabs.developers.google.com/codelabs/cosu/index.html?#2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未知管理员:ComponentInfo - 尝试为生产 Android 设备启用 kiosk 模式? 的相关文章

随机推荐

  • 不等待 AJAX 请求的响应

    假设我从 jQuery 向后端 PHP 脚本发出 AJAX HTTP 请求 发出请求后 PHP 脚本开始运行并发挥其魔力 假设我随后更改为另一个网站 远离发出原始 AJAX 请求的网站 同样 我在 PHP 脚本完成之前执行此操作 并且有时间
  • 查找两个已排序数组的前 k 个和

    给定两个已排序的数组 大小分别为 n 和 m 你的任务 如果你选择接受它 是输出以下形式的最大 k 和a i b j O k log k 解决方案可以在这里找到 http www ocf berkeley edu wwu cgi bin y
  • 获取附件的 url

    我正在使用 CouchApp 构建一个简单的 Web 应用程序 允许上传和管理图片 实际的图像文件作为文档的附件存储 如下所示 id 09fe82d75a26f9aa5e722d6b220180d2 rev 2 5797b822c83b9d
  • 如何在 sed 的命令中使用变量?

    I have abc sh exec ROOT Subsystem xyz sh 在 Unix 机器上 如果我打印echo HOME然后我得到 HOME COM FILE 我想更换 ROOT with HOME使用 sed 预期输出 exe
  • iPhone:禁用“双击空格键。”捷径?

    默认情况下 如果您在 iPhone 或 iPad 上点击空格键两次 则不会得到 两个空格 而是得到 句点后跟一个空格 有什么方法可以在代码中禁用此快捷方式吗 更新 通过 UITextInputTraits 禁用自动更正不起作用 更新2 明白
  • Scala中涉及抽象类型时没有动态绑定?

    当我在 Martin Odersky 的抽象类型中尝试动物 食品示例时Scala 编程 class Food abstract class Animal type SuitableFood lt Food def eat food Suit
  • 将 vue-router 组件解释为一个函数

    我在几个不同的地方看到了以下类型的路由定义 path dashboard component render c return c router view children path component Dashboard 我试图理解这有什么
  • Linux 中的 SDL 桌面分辨率检测[重复]

    这个问题在这里已经有答案了 我收到一些报告称 对于某些 Linux 用户 尤其是使用 SteamOS 的用户 我的游戏以错误的分辨率打开 游戏尝试检测当前桌面分辨率并使用该分辨率创建无边框全屏窗口 例如 SteamOS 的分辨率通常为 19
  • java.lang.StackOverflowError:在 ListView 适配器中启用/禁用 TextView#setTextIsSelectable 时堆栈大小为 8MB

    我有一个活动ListView 显示TextView在每个列表项中 使用这些方法切换选定位置的属性EditText setTextIsSelectable EditText setEllipsize EditText setSingleLin
  • XCTest相对于SenTestingKit有哪些优势?

    我想在 iOS 中进行单元测试 默认情况下 测试类是使用 Xcode 5 中的 XCTest 框架类创建的 我在早期版本的 iOS 中使用了 SenTestingKit 这两个框架有什么区别 XCTest框架有哪些优势 我用谷歌搜索了相关文
  • 材料表使行在单击时可编辑

    使用材料表 https material table com 库中 我试图使表行可以通过双击进行编辑 单击该行应该与单击操作列最左侧的编辑按钮具有相同的效果 我已成功链接到正确的事件处理程序 现在双击一行时由警报框表示 https code
  • kohana3.0如何彻底删除镜像文件?

    我有一个 kohana3 0 内容和文件管理系统 当用户删除图像时 我希望能够从数据库以及我上传图像的文件夹中完全删除图像 现在我用于图像删除 public function delete id NULL parent delete id
  • gdb - 执行命令n次

    我正在使用 gdb 调试器来运行一个包含循环的程序 让我们坐在 10 中 当我进入循环时 我不想进入它 我知道我可以在循环之后设置第二个断点 而不是 c 继续 但我也记得有可能做类似 n 10 接下来的 10 次 的事情 n 10 不起作用
  • 如何使用 Ansible 创建新分区

    当我在命令行上运行它时 它工作正常 echo e n np n1 n n nw sudo fdisk dev sdb 但在 Ansible 中它不想在 shell 中运行 name partition new disk shell echo
  • 如何在运行时填充 boost::fusion::vector ?

    首先 为与我之前的问题相似而道歉here https stackoverflow com questions 13094535 iterating over boost fusionvector 但我认为我问得不对 我有一个方法 templ
  • 在 .net 2.0 应用程序中加载 .net 3.5 wpf-forms

    我正在尝试在 net 2 0 Windows 窗体应用程序中加载和托管 WPF 控件 仅当安装了 net 3 5 时才应加载 WPF 控件 我找到了一个链接在 MFC 应用程序中托管 WPF 内容 http www codeguru com
  • npm 认为 Node 已经过时了,但事实并非如此

    我正在尝试安装node gyp 我跑 sudo npm install g node gyp 我收到一条错误 提示它需要节点 0 8 0 并提示我正在运行 0 6 12 问题是 我不是 我正在使用 NVM 目前正在运行 0 11 somet
  • 如何将 numpy 数组列表转换为单个 numpy 数组?

    假设我有 LIST array 1 2 3 4 5 array 1 2 3 4 5 1 2 3 4 5 inner lists are numpy arrays 我尝试转变 array 1 2 3 4 5 1 2 3 4 5 1 2 3 4
  • 无法在 Google App Engine 上运行 Flask 调试模式

    我正在使用 Python 2 7 在 Google App Engine 上运行 Flask 0 9 Werkzeug 0 8 3 并且我非常希望运行 Werkzeug 调试器 尝试使用后werkzeug appengine debugge
  • 未知管理员:ComponentInfo - 尝试为生产 Android 设备启用 kiosk 模式?

    我正在尝试为我的设备启用信息亭模式 但收到未知的管理错误 我很确定我成功地将我的应用程序设置为设备所有者 并且我认为这是最后一步 但这个错误给我带来了很多麻烦 清单 我这里有一个接收器 应该将我的应用程序绑定为设备管理员 它还引用了 dev