【Android】如何使App变成Device Owner(设备所有者)
【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。如果已经配置过了,可以恢复出场设置。
开始操作:
- 对Mobile A恢复出厂设置(Factory Reset),一般在Settings(设置)里就可以选择(比较文明的方式);也可以用比较粗暴的方式,按键的方式(一般是同时按住 音量向上键+Home键+电源键 几秒,然后会出现选项,可以选择)。
- 当Mobile A的恢复出厂设置结束后,Mobile A会出现初始设置的界面。此时,Mobile A就是处于unprovisioned(还没被设置)的状态。
- 在Mobile B上,安装我们的SetDeviceOwner这个App,也就是要使其他设备的App成为Device Owner的,术语叫做“Device owner provisioning”。
- 在Mobile B上开启SetDeviceOwner这个App,点击“Generate checksum”按钮,会生成checksum(校验码)。
- Mobile A处于初始配置状态,两台设备的屏幕都是打开的。将两台设备(Mobile A和Mobile B)背靠背,足够近,直到听到清脆的“叮”的声响,然后在Mobile B上轻触屏幕,即开始从Mobile B向Mobile A进行NFC的数据传输。
- 当NFC传输完成后(一般瞬间就完成了),Mobile A上会显示配置Device Owner的界面,标题貌似是Set up your profile(记不清了...),点击Set up按钮之后会问你要不要Encrypt设备(对数据加密),点击“是”(OK),然后选择快速Encrypt还是对所有数据Encrypt(加密所有数据会很慢),一般都选Fast Encryption就好。然后开始对手机的数据加密,不要问为什么,就是必须要这步。
- 加密完成后,Mobile A会重启。然后,因为之前我们传输过去的数据里面指定了WiFi的SSID和密码,而且也指定了那个要成为Device Owner的App的下载链接(URL),因此,会显示让你配置选择WiFi,请选择你之前指定的那个WiFi,并连接。
- 一旦WiFi成功连接上Internet,就会开始下载指定的App。下载完成后会开始安装,然后会使这个App成为Device Owner。
- 如果你看到一个Toast跳出来说:Device Owner enabled,那么就OK了。恭喜,你的App已经成为了Mobile A的Device 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的源代码下载,研究一下,源码的内容也不多。
有问题请在留言区提问交流,欢迎指正。