【问题标题】:Device owner on a nonrooted device (Android L), without NFC, using adb shell, dpm set-device-owner无根设备 (Android L) 上的设备所有者,没有 NFC,使用 adb shell,dpm set-device-owner
【发布时间】:2015-07-01 14:21:24
【问题描述】:

这里的最终目的是在“kiosk mod”中拥有一个设备。

Theysay你不需要NFC也不需要root来实现应用程序变成device owner。我还没有看到这种方法的完整示例,但让我们尝试一下:

adb shell dpm set-device-owner <package>/.<ReceiverImplementation>

应该这样做...所以我这样做了,然后得到:

java.lang.SecurityException: 
Neither user 2000 nor current process has android.permission.BIND_DEVICE_ADMIN.

因此,以下代码返回 false。

((DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE))
   .isDeviceOwnerApp(getApplicationContext().getPackageName())

This STO question 提出了类似的问题,但没有指定实际失败..

Manifest 文件和其余的源代码大部分灵感来自this google sample

<manifest
    package="com.example.android.deviceowner"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:versionName="1.0">

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

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <receiver
            android:name=".DeviceOwnerReceiver"
            android:description="@string/app_name"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_owner_receiver"/>
            <intent-filter>
                <action android:name="android.app.action.ACTION_DEVICE_ADMIN_ENABLED"/>
            </intent-filter>
        </receiver>

    </application>

</manifest>

我目前正在尝试执行此操作的设备是 LG G Pad。

【问题讨论】:

  • 澄清一下...您的接收器在清单中有 android.permission.BIND_DEVICE_ADMIN 但您仍然遇到此异常?
  • 是的,我将编辑问题以显示这一点。
  • 还有一个问题。您的 device_owner_receiver.xml 文件中有什么内容?
  • 没有改变那个
  • android 文档状态:To deploy and activate a device owner, you must perform an NFC data transfer...@developer.android.com/about/versions/…

标签: android android-5.0-lollipop kiosk-mode


【解决方案1】:

您的清单文件似乎正确。 您应该知道,它可能来自您执行此命令时的系统状态。在成功运行dpm 命令之前应该检查很多点:

  • 确保您的应用已安装,就像任何其他休闲应用一样
  • 确保当前用户未设置任何帐户(确保未在“设置”>“帐户”中设置帐户)。
  • 不应有已注册的现有设备所有者

最好的办法(这确实是我在试验时所做的)是完全恢复出厂设置并避免大多数配置步骤(除了强制性步骤“配置 Wi-Fi”和“名称”),并且 不要关联任何 Google 帐户。
配置后,您一定会处于干净状态。 那么,

  1. 激活调试
  2. 使用您的 IDE(或使用 pm install...)安装您的应用
  3. 运行命令adb shell dpm set-device-owner ...

我已经写了an article explaining most of these steps on my blog,看看它,它可能对你有用。

【讨论】:

  • 我已按照说明进行操作,恢复出厂设置,未设置帐户,用户.. 所有者... 问题似乎仍然存在,此时我确定它与设备选择有关。感谢您的回复。
  • 你能分享一个在你的情况下不起作用的极简测试用例源代码(例如通过 github)吗?我有兴趣在 Nexus 9 上进行测试(并确认这是否真的取决于供应商对供应应用程序的实施)。
  • 其中一个测试用例是你的 github.com/florentdupont/AndroidScreenPinning/tree/master/DeviceOwnerApp,当然还有提到 dpm 调用时的异常。
  • 好的。那么没有其他想法了.. 也许您应该联系 LG 的支持人员?
【解决方案2】:

我不确定这是否会对您有所帮助,但如果不是您,也许其他人会使用此解决方案。我与三星 Tab A 有一个非常相似的问题。我无法为我的应用程序设置所有权。总是在运行时:

adb shell dpm set-device-owner cy.com.myapp/.AdminReceiver

我得到了:

java.lang.SecurityException: Neither user 2000 nor current process has 
com.sec.enterprise.permission.MDM_PROXY_ADMIN_INTERNAL.

经过长时间的搜索,我终于发现我需要在我的清单权限中添加三星的特殊权限:

<uses-permission android:name="com.samsung.accessory.permission.ACCESSORY_FRAMEWORK" />

成功了,现在我的应用可以按需进入信息亭模式。可能您正在查看类似的问题 - 您可能需要为您的 LG 设置一个或多个权限设置。 我的解决方案适用于非 root 设备(显然没有添加任何帐户 - 恢复出厂设置后全新)。

【讨论】:

  • 您有该权限的来源吗?我正在使用与您完全相同的设备,但它对我不起作用。您需要“附件框架”权限才能启用设备所有者,这似乎很奇怪。
  • 据我记忆,我在三星开发者论坛上找到了这个,但我不记得具体在哪里。该主题并未完全涉及我的问题,但是经过几天的搜索,我愿意尝试任何事情。因为它适用于我拥有的平板电脑,所以我很满意。抱歉,我无法提供更多帮助。
  • 我们在三星 Tab A 上也遇到了这个错误,但是我们为我们的应用程序使用了错误的包名称。当我们更正包名称目录时,它已修复。清单中的上述添加对我们来说不是必需的
猜你喜欢
  • 2019-08-13
  • 2017-11-01
  • 2021-06-28
  • 2019-07-17
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多