Leslie心蓝 2019-03-25
【Android】如何使App变成Device Owner(设备所有者)
Android从5.0版(Lollipop)开始引入了一个新的概念:Device Owner。
Device Owner是什么?
在介绍之前,先来使用一下英语。
Device Owner是由Device("设备")和Owner("所有者,物主")这两个英语单词组成的。因此,其实按照字面意思已经了解了大概:Device Owner就是“设备所有人”。再论英语对编程进阶的重要性。
根据谷歌Android开发者主页上的介绍:
https://developer.android.com/about/versions/android-5.0.html#DeviceOwner
这个网址打不开的朋友就看下面这段描述:
A device owner is a specialized type of device administrator that has the additional ability to create and remove secondary users and to configure global settings on the device. Your device owner app can use the methods in the DevicePolicyManager class to take fine-grain control of the configuration, security, and apps on managed devices. A device can have only one active device owner at a time.
翻译过来就是:
设备所有者是特殊类型的Device Administrator(设备管理员,也有很高的权限,不过一台设备可以有多个Device Administrator。要删除Device Administrator的App需要先把管理员身份取消),且具有创建和删除次级用户(也就是除了设备所有者以外的其他用户帐号,就是任性!),并在设备上配置全局设置。成为Device Owner的App可以使用在DevicePolicyManager类中的方法,来控制设备的设置,安全,App。一台设备同时只能有一个活动的设备所有者。
所以成为Device Owner的App有点类似“大管家”,基本上什么事都能干。而且成为Device Owner的App不能被卸载,不能被禁用。
如何使一个App成为Device Owner
看下面这个链接:
https://source.android.com/devices/tech/admin/provision.html
不番茄是打不开的。
反正上面的链接里说了,目前有两种方式来使一个App成为Device Owner:
- 使用NFC方式(适用于Android 5.0及更高版本)
下面有演示视频哦!
NFC是Near Field Communication(近距离无线通讯技术)。
用NFC传输的方式来使一个App成为Device Owner(设备所有者),我们需要两部手机。是的,略坑爹。
首先,两台设备都要支持NFC并激活了NFC,并且激活了Android Beam功能(在设置里的NFC and payment里)。
第一台设备(Mobile A)是要在其上安装App,并使这个App成为Device Owner的。这个App可以是任意的一个App(我们的例子中是一个叫作Kiosk Mode Demo的App。
第二台设备(Mobile B)是要provision那台Mobile A的(使Mobile A上的App成为Device Owner),算是数据传输方/服务提供方。Mobile B上安装了我们的SetDeviceOwner这个App。
然后,在那个SetDeviceOwner的App里的源码中,比较关键的设置是下面几个:
EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME
对应要成为Device Owner的App的完整包名,例如:com.enmingx.test
EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_LOCATION
对应要成为Device Owner的App的下载URL,例如:http://www.dropbox.com/xxx
EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
对应要成为Device Owner的App的checksum(校验码),要计算校验码,可以用adb命令:
cat MY_APP.apk | openssl dgst -binary -sha1 | openssl base64 | tr '+/' '-_' | tr -d '='
EXTRA_PROVISIONING_WIFI_SSID
对应用于下载要成为Device Owner的App的WiFi的名称
EXTRA_PROVISIONING_WIFI_SECURITY_TYPE
对应用于下载要成为Device Owner的App的安全类型,比如WPA或WPA2
最后,在那个SetDeviceOwner的App源码里,把这些数据都“打包”到一个NFC Bundle中,用NFC技术来传输到另一台手机。
你应该知道如何使用NFC来进行数据传输吧:
让两个手机足够接近,背靠背,然后会听到清脆的一声“叮”,显示"Touch to beam",然后你轻触作为传输方的那台设备的屏幕,就开始传输了。
为了成功使一台设备上的App成为Device Owner,这台设备必须从来没被配置过(当然更不能被Root过),也不能被设置过Device Owner或Profile Owner。如果已经配置过了,可以恢复出场设置。
开始操作:
演示视频
SetDeviceOwner这个App的源码在这里:
https://github.com/frogoscar/DeviceOwner
或者点击左下角的「阅读原文」,进入链接(是我的Github里的一个目录)。
- 使用激活码方式(仅适用于Android 5.0和5.1,不适用于6.0或更高版本)
因为使用激活码的方式仅适用于Android 5.0和5.1,就不介绍了。有兴趣折腾的朋友可以自己番茄去下面的链接:
https://developers.google.com/android/work/prov-devices#activation_code_method
当然了,Google自己也很贴心地给了两个演示的App:
Google的两个小例子App(使用NFC方式)
Google也在Github上放了两个演示的例子,为什么是两个呢?上面也说了。要用NFC的方式,需要两台手机哦!一台作为Provisioning的提供者,一台是你真正想让自己的App成为Device Owner的。
https://github.com/googlesamples/android-NfcProvisioning (将这个App安装在提供provision服务,作为传输方的设备上)(对应上面的那个Mobile B)
https://github.com/googlesamples/android-DeviceOwner (将这个App安装在你要此App成为Device Owner的那台设备上(对应上面的那个Mobile A)
Google的例子里的做法是让我们把android-DeviceOwner这个App先安装到Mobile A中,就不必下载了。
不过,按照Google的小例子中的描述用法,行不通。
因为它等于没有给出下载那个要成为Device Owner的App的链接和Checksum,只给了那个App的包名。但是如果按照Google的两个例子App来做,NFC传输完毕后,会直接启动Mobile A上的配置界面,但是会出现:
Oops!
This device is already set up!
的提示,然后点击OK,就没有下文了。
already set up表示“您的设备已经配置过了”。因此我们要在还没配置完毕时来操作。就如上面描述的那样,可以Factory Reset(恢复出场设置)一下,然后再进行初始配置。
所以,你需要修改Google的那个android-NfcProvisioning的App,而且要把android-DeviceOwner那个App上传到一个你可以下载的地方,比如Dropbox,开启共享。
但是,我觉得很可能是因为我用的是三星的盖世系列:Galaxy S6和A5来作为测试设备的。
三星的设备在初始设置后也许已经set up了整个设备,因为三星会给手机预装很多自己开发的App,例如S Voice。
所以也许在你的Android设备上,Google的两个例子App是可以成功的。
我知道这篇较难理解,除非你自己亲自操作一下。
把SetDeviceOwner这个App的源代码下载,研究一下,源码的内容也不多。
有问题请在留言区提问交流,欢迎指正。