在未root的Android L设备上,不使用NFC,通过adb shell命令设置设备所有者。

9

最终目的是让设备处于“展示模式”。

他们 ,为实现应用成为设备所有者,不需要NFC或root权限。我还没有看到这种方法的完整示例,但让我们试试:

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())

这个STO问题提出了类似的问题,但没有具体说明失败的原因。

清单文件和其他源代码大多受到这个谷歌示例的启发。

<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设备。


还有一个问题。你的device_owner_receiver.xml文件里有什么? - Okas
1
Android文档指出:“要部署和激活设备所有者,必须执行NFC数据传输...” @ http://developer.android.com/about/versions/android-5.0.html#DeviceOwner - Randy
我注意到了那一行,并且分享的链接说明这是一个可能的选项。我希望dpm能够解决这个问题。 - Rin malavi
我认为你需要在清单文件的开头明确声明<uses-permission>,以便pm(包管理器)将其作为应用程序级别的权限捕获。 - Aaron Gillion
@kash 看起来是同样的问题。 - Rin malavi
显示剩余10条评论
2个回答

3
您的清单文件似乎正确。 您应该意识到,这可能来自您执行此命令时系统状态的影响。在成功运行dpm命令之前,许多要点都应该被检查:
  • 确保您的应用程序已经安装,就像任何其他普通应用一样
  • 确保当前用户没有设置任何帐户(在“设置”>“帐户”中确保没有设置任何帐户)。
  • 不应该有现有的设备所有者已经注册

最好的方法(实际上我在进行实验时也是这样做的)是完全出厂重启您的手机并避免大多数配置步骤(除了必须的步骤“配置Wi-Fi”和“名称”),并且不要关联任何Google帐户
一旦预配完成,您就可以确保处于干净的状态。然后,

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

我在我的博客上写了一篇解释大部分步骤的文章,看看它,可能对你有用。


我已经按照指示进行了恢复出厂设置,没有设置账户、用户或所有者等。问题似乎仍然存在,现在我确定问题出在设备选择上。感谢您的回复。 - Rin malavi
你能分享一个极简的测试用例源代码(例如通过github)在你的情况下无法工作吗?我很想在Nexus 9上进行测试,并确认这是否真的取决于供应商的预配应用程序实现。 - Florent Dupont
其中一个测试用例是你的 github.com/florentdupont/AndroidScreenPinning/tree/master/DeviceOwnerApp,在调用dpm时出现了上述异常。 - Rin malavi
好的。如果没有其他想法,也许你应该联系LG的支持? - Florent Dupont

1

我不确定这是否对您有帮助,但如果不是您,也许其他人会使用此解决方案。 我在三星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设备(显然没有添加任何帐户 - 工厂重置后是全新的)。

2
你有这个权限的来源吗?我使用和你完全相同的设备,但是它对我不起作用。需要“辅助框架”权限来启用设备所有者似乎很奇怪。 - Niklas Ekman
据我所记,我在三星开发者论坛上找到了这个,但我不记得具体在哪里了。这个主题并没有完全涉及到我的问题,但是经过几天的搜索,我愿意尝试任何东西。而且由于它在我拥有的平板电脑上有效,我很满意。抱歉我不能提供更多帮助。 - mikeyy
我们在三星Tab A上也遇到了这个错误,但是我们使用了错误的应用程序包名称。当我们更正了包名目录后,问题得到了解决。对于我们来说,上述添加到清单中的内容是不必要的。 - Codelicious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接