Merge "docs: work minisite" into mnc-io-docs
@@ -703,8 +703,18 @@ redirects:
|
||||
to: /training/location/index.html
|
||||
- from: /google/gcm/adv.html
|
||||
to: /google/gcm/gcm.html
|
||||
- from: /work
|
||||
to: /training/enterprise/index.html
|
||||
- from: /training/enterprise/index.html
|
||||
to: /work/index.html
|
||||
- from: /training/enterprise/app-compatibility.html
|
||||
to: /work/managed-profiles.html
|
||||
- from: /training/enterprise/app-restrictions.html
|
||||
to: /work/app-restrictions.html
|
||||
- from: /training/enterprise/cosu.html
|
||||
to: /work/cosu.html
|
||||
- from: /training/enterprise/device-management-policy.html
|
||||
to: /work/device-management-policy.html
|
||||
- from: /training/enterprise/work-policy-ctrl.html
|
||||
to: https://developers.google.com/android/work/build-dpc
|
||||
- from: /distribute/tools/promote/badge-files.html
|
||||
to: https://play.google.com/intl/en_us/badges/
|
||||
- from: /google/gcm/...
|
||||
|
||||
@@ -52,10 +52,13 @@ page.image=images/distribute/gpfw.jpg
|
||||
<h3 id="design">Develop a great app for business</h3>
|
||||
|
||||
<ul>
|
||||
<li>Follow best practices for security and manage user data properly. Businesses
|
||||
are more conscious of data security and employee productivity, especially when it
|
||||
comes to features that share information with other services.</li>
|
||||
<li>Support the <a href="{@docRoot}training/enterprise/app-restrictions.html">App Configuration framework</a> to let an administrator remotely configure app settings such as:
|
||||
<li>Follow best practices for security and manage user data
|
||||
properly. Businesses are more conscious of data security and
|
||||
employee productivity, especially when it comes to features that
|
||||
share information with other services.</li>
|
||||
<li>Support the <a href="{@docRoot}work/app-restrictions.html"
|
||||
>App Configuration framework</a> to let an administrator remotely
|
||||
configure app settings such as:
|
||||
<ul>
|
||||
<li>Server address and protocol settings</li>
|
||||
<li>The ability to switch features on and off</li>
|
||||
@@ -65,11 +68,15 @@ page.image=images/distribute/gpfw.jpg
|
||||
</li>
|
||||
<li>Request the minimum permissions that your app needs.</li>
|
||||
<li>Make sure communication to your backend and data in your backend is secure.</li>
|
||||
<li>Implement authorization policies that will minimize the number of your employees that can access user data.</li>
|
||||
<li><a href={@docRoot}training/enterprise/app-compatibility.html>Offer compatibility with work
|
||||
profile</a> and test that with the <a href="{@docRoot}samples/BasicManagedProfile/index.html"
|
||||
>BasicManagedProfile sample app</a>.</li>
|
||||
<li>Support <a href="{@docRoot}training/enterprise/app-restrictions.html">app restrictions</a> so that IT admins can remotely configure your app through leading EMM solutions.</li>
|
||||
<li>Implement authorization policies that will minimize the number of your
|
||||
employees that can access user data.</li>
|
||||
<li><a href="{@docRoot}work/managed-profiles.html">Offer compatibility with work
|
||||
profile</a> and test that with the
|
||||
<a href="{@docRoot}samples/BasicManagedProfile/index.html"
|
||||
>BasicManagedProfile sample app</a>.</li>
|
||||
<li>Support <a href="{@docRoot}work/app-restrictions.html">app restrictions</a>
|
||||
so that IT admins can remotely configure your app through leading
|
||||
EMM solutions.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="support">Provide support and maintenance</h3>
|
||||
|
||||
@@ -48,11 +48,12 @@ solutions for Android-powered devices. It discusses the various features
|
||||
provided by the Device Administration API to provide stronger security for
|
||||
employee devices that are powered by Android.</p>
|
||||
|
||||
<p class="note"><strong>Note</strong> For information on building a Work Policy
|
||||
Controller for Android for Work deployments, see <a
|
||||
href="{@docRoot}training/enterprise/work-policy-ctrl.html">Building a Work
|
||||
Policy Controller</a>.</p>
|
||||
|
||||
<p class="note">
|
||||
<strong>Note</strong> For information on building a Work Policy
|
||||
Controller for Android for Work deployments, see
|
||||
<a href="https://developers.google.com/android/work/build-dpc"
|
||||
>Build a Device Policy Controller</a>.
|
||||
</p>
|
||||
|
||||
<h2 id="overview">Device Administration API Overview</h2>
|
||||
|
||||
|
||||
BIN
docs/html/images/work/cards/android-studio_600px.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
docs/html/images/work/cards/briefcase_600px.png
Normal file
|
After Width: | Height: | Size: 9.3 KiB |
BIN
docs/html/images/work/cards/work-cloud_600px.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
BIN
docs/html/images/work/cards/work-devhub_600px.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
docs/html/images/work/cards/work-folder_600px.png
Normal file
|
After Width: | Height: | Size: 164 KiB |
BIN
docs/html/images/work/cards/work-profile_600px.png
Normal file
|
After Width: | Height: | Size: 86 KiB |
BIN
docs/html/images/work/cosu-pinning_vs_locktaskmode.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
docs/html/images/work/cosu-pinning_vs_locktaskmode_2x.png
Normal file
|
After Width: | Height: | Size: 157 KiB |
BIN
docs/html/images/work/guide-app-restrictions.png
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
docs/html/images/work/guide-app-restrictions_2x.png
Normal file
|
After Width: | Height: | Size: 240 KiB |
BIN
docs/html/images/work/guide-managed-overview.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
docs/html/images/work/guide-managed-overview_2x.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
docs/html/images/work/hero_650px.png
Normal file
|
After Width: | Height: | Size: 222 KiB |
BIN
docs/html/images/work/hero_650px_2x.png
Normal file
|
After Width: | Height: | Size: 773 KiB |
|
Before Width: | Height: | Size: 225 KiB After Width: | Height: | Size: 225 KiB |
@@ -365,7 +365,7 @@ var RESOURCE_COLLECTIONS = {
|
||||
"resources": [
|
||||
"https://www.android.com/work/",
|
||||
"https://www.youtube.com/watch?v=jQWB_-o1kz4&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
"training/enterprise/index.html"
|
||||
"work/index.html"
|
||||
]
|
||||
},
|
||||
"distribute/essentials": {
|
||||
@@ -1749,26 +1749,6 @@ var RESOURCE_COLLECTIONS = {
|
||||
"training/monitoring-device-state/index.html"
|
||||
]
|
||||
},
|
||||
"training/work/apps": {
|
||||
"title": "",
|
||||
"resources": [
|
||||
"training/enterprise/app-compatibility.html",
|
||||
"training/enterprise/app-restrictions.html",
|
||||
"training/enterprise/cosu.html",
|
||||
"https://www.youtube.com/watch?v=39NkpWkaH8M&index=2&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
"samples/AppRestrictionSchema/index.html",
|
||||
"https://www.youtube.com/watch?v=dH41OutAMNM",
|
||||
"samples/AppRestrictionEnforcer/index.html"
|
||||
]
|
||||
},
|
||||
"training/work/admin": {
|
||||
"title": "",
|
||||
"resources": [
|
||||
"training/enterprise/work-policy-ctrl.html",
|
||||
"samples/BasicManagedProfile/index.html",
|
||||
"https://www.youtube.com/watch?v=j3QC6hcpy90"
|
||||
]
|
||||
},
|
||||
"tools/help/log": {
|
||||
"title": "",
|
||||
"resources": [
|
||||
@@ -1887,4 +1867,45 @@ var RESOURCE_COLLECTIONS = {
|
||||
"https://medium.com/google-developers/writing-more-code-by-writing-less-code-with-android-studio-live-templates-244f648d17c7#.hczcm02du",
|
||||
]
|
||||
},
|
||||
}
|
||||
"work/landing/primary": {
|
||||
"title": "",
|
||||
"resources": [
|
||||
"work/overview.html",
|
||||
"work/guide.html",
|
||||
"https://connect.googleforwork.com/community/applicants/android/isv",
|
||||
"work/app-restrictions.html",
|
||||
"work/cosu.html",
|
||||
"work/managed-profiles.html"
|
||||
]
|
||||
},
|
||||
"work/landing/resources": {
|
||||
"title": "",
|
||||
"resources": [
|
||||
"https://developers.google.com/android/work/",
|
||||
"https://www.google.com/work/android/",
|
||||
"https://developers.google.com/android/work/build-dpc",
|
||||
"https://www.youtube.com/watch?v=jQWB_-o1kz4&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
"https://www.youtube.com/watch?v=39NkpWkaH8M&index=2&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
"https://www.youtube.com/watch?v=dH41OutAMNM&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX"
|
||||
]
|
||||
},
|
||||
"work/apps": {
|
||||
"title": "",
|
||||
"resources": [
|
||||
"work/managed-profiles.html",
|
||||
"work/app-restrictions.html",
|
||||
"work/cosu.html",
|
||||
"https://www.youtube.com/watch?v=39NkpWkaH8M&index=2&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
"samples/AppRestrictionSchema/index.html",
|
||||
"samples/AppRestrictionEnforcer/index.html"
|
||||
]
|
||||
},
|
||||
"work/admin": {
|
||||
"title": "",
|
||||
"resources": [
|
||||
"https://developers.google.com/android/work/build-dpc",
|
||||
"samples/BasicManagedProfile/index.html",
|
||||
"https://www.youtube.com/watch?v=j3QC6hcpy90"
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3270,19 +3270,55 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([
|
||||
"type":"distribute"
|
||||
},
|
||||
{
|
||||
"title":"Android for Work",
|
||||
"title":"Join the Android for Work DevHub",
|
||||
"titleFriendly":"",
|
||||
"summary":"Learn more about how Android for Work makes your favorite phones and tablets the perfect business tools.",
|
||||
"url":"https://www.android.com/work/",
|
||||
"summary":"The Android for Work DevHub is a place to help developers keep up with Android in the workplace.",
|
||||
"url":"https://connect.googleforwork.com/community/applicants/android/isv",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "isv", "devhub"],
|
||||
"tags": [],
|
||||
"image":"images/work/cards/work-devhub_600px.png",
|
||||
"lang":"en",
|
||||
"type":"Community"
|
||||
},
|
||||
{
|
||||
"title":"Enterprise Mobility Managers",
|
||||
"titleFriendly":"",
|
||||
"summary":"Integrate Android for Work into your enterprise mobility management (EMM) solution.",
|
||||
"url":"https://developers.google.com/android/work/",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "emm"],
|
||||
"tags": [],
|
||||
"image":"images/cards/card-android-work_2x.png",
|
||||
"image":"images/work/cards/work-cloud_600px.png",
|
||||
"lang":"en",
|
||||
"type":"guide"
|
||||
},
|
||||
{
|
||||
"title":"Learn More About Android for Work",
|
||||
"titleFriendly":"",
|
||||
"summary":"Android for Work makes your favorite phones and tablets the perfect business tools.",
|
||||
"url":"https://www.google.com/work/android/",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "emm"],
|
||||
"tags": [],
|
||||
"image":"images/work/cards/work-profile_600px.png",
|
||||
"lang":"en",
|
||||
"type":"about"
|
||||
},
|
||||
{
|
||||
"title":"Android for Work DevBytes",
|
||||
"title":"Build a Device Policy Controller",
|
||||
"titleFriendly":"",
|
||||
"summary":"Create and administer a managed profile on an employee's device.",
|
||||
"url":"https://developers.google.com/android/work/build-dpc",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "emm"],
|
||||
"tags": [],
|
||||
"image":"images/work/cards/work-folder_600px.png",
|
||||
"lang":"en",
|
||||
"type":"guide"
|
||||
},
|
||||
{
|
||||
"title":"Android for Work for Developers",
|
||||
"titleFriendly":"",
|
||||
"summary":"Watch the videos in this playlist to understand more about Android for Work and get tips on developing enterprise apps.",
|
||||
"url":"https://www.youtube.com/watch?v=jQWB_-o1kz4&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
@@ -3306,10 +3342,10 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([
|
||||
"type":"youtube"
|
||||
},
|
||||
{
|
||||
"title":"Building an enterprise ready app",
|
||||
"title":"Building an Enterprise Ready App",
|
||||
"titleFriendly":"",
|
||||
"summary":"A holistic view of Android for Work for developers.",
|
||||
"url":"https://www.youtube.com/watch?v=dH41OutAMNM",
|
||||
"url":"https://www.youtube.com/watch?v=dH41OutAMNM&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "emm"],
|
||||
"tags": [],
|
||||
@@ -3437,18 +3473,6 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([
|
||||
"lang":"en",
|
||||
"type":"Video"
|
||||
},
|
||||
{
|
||||
"title":"Android for Work: Single Use Devices",
|
||||
"titleFriendly":"",
|
||||
"summary":"Android M is bringing the power of Android to all kinds of workplaces.",
|
||||
"url":"https://www.youtube.com/watch?v=j3QC6hcpy90",
|
||||
"group":"",
|
||||
"keywords": ["Marshmallow"],
|
||||
"tags": [],
|
||||
"image":"https://i1.ytimg.com/vi/j3QC6hcpy90/maxresdefault.jpg",
|
||||
"lang":"en",
|
||||
"type":"Video"
|
||||
},
|
||||
{
|
||||
"title":"Runtime Permissions in Android 6.0 Marshmallow",
|
||||
"titleFriendly":"",
|
||||
|
||||
@@ -3182,19 +3182,127 @@ METADATA['en'].extras = METADATA['en'].extras.concat([
|
||||
},
|
||||
{
|
||||
"title":"Android for Work",
|
||||
"category":"Enterprise",
|
||||
"summary":"Learn more about how Android for Work makes your favorite phones and tablets the perfect business tools.",
|
||||
"url":"https://www.android.com/work/",
|
||||
"titleFriendly":"",
|
||||
"summary": "Develop apps for Android for Work to take advantage of security and management features built into Android.",
|
||||
"url":"https://developer.android.com/work",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "emm"],
|
||||
"tags": [],
|
||||
"image":"images/cards/card-android-work_2x.png",
|
||||
"image":"images/work/cards/briefcase_600px.png",
|
||||
"lang":"en",
|
||||
"type":"work"
|
||||
},
|
||||
{
|
||||
"title":"Android for Work Developer Overview",
|
||||
"titleFriendly":"",
|
||||
"summary": "Learn how to build Android apps for the enterprise and take advantage of Google's Android for Work program.",
|
||||
"url":"https://developer.android.com/work/overview.html",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "emm"],
|
||||
"tags": [],
|
||||
"image":"images/work/cards/briefcase_600px.png",
|
||||
"lang":"en",
|
||||
"type":"guide"
|
||||
},
|
||||
{
|
||||
"title":"Android for Work Developer Guide",
|
||||
"titleFriendly":"",
|
||||
"summary": "Android for Work provides organizations with a secure, flexible, and unified Android mobility platform combining devices, applications, and management.",
|
||||
"url":"https://developer.android.com/work/guide.html",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "emm"],
|
||||
"tags": [],
|
||||
"image":"images/work/cards/android-studio_600px.png",
|
||||
"lang":"en",
|
||||
"type":"guide"
|
||||
},
|
||||
{
|
||||
"title":"Set up App Restrictions",
|
||||
"titleFriendly":"",
|
||||
"summary": "Learn how to implement app restrictions and configuration settings that can be changed by other apps on the same device.",
|
||||
"url":"https://developer.android.com/work/app-restrictions.html",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "emm"],
|
||||
"tags": [],
|
||||
"image":"images/work/cards/briefcase_600px.png",
|
||||
"lang":"en",
|
||||
"type":"guide"
|
||||
},
|
||||
{
|
||||
"title":"Set up Managed Profiles",
|
||||
"titleFriendly":"",
|
||||
"summary": "Learn how to make sure your apps operate smoothly in a corporate environment by following some best practices.",
|
||||
"url":"https://developer.android.com/work/managed-profiles.html",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "emm"],
|
||||
"tags": [],
|
||||
"image":"images/work/cards/briefcase_600px.png",
|
||||
"lang":"en",
|
||||
"type":"guide"
|
||||
},
|
||||
{
|
||||
"title":"Set up Single-Purpose Devices",
|
||||
"titleFriendly":"",
|
||||
"summary": "Learn how to develop single-use solutions for Android devices.",
|
||||
"url":"https://developer.android.com/work/cosu.html",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "emm"],
|
||||
"tags": [],
|
||||
"image":"images/work/cards/briefcase_600px.png",
|
||||
"lang":"en",
|
||||
"type":"guide"
|
||||
},
|
||||
{
|
||||
"title":"Join the Android for Work DevHub",
|
||||
"titleFriendly":"",
|
||||
"summary":"The Android for Work DevHub is a place to help developers keep up with Android in the workplace.",
|
||||
"url":"https://connect.googleforwork.com/community/applicants/android/isv",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "isv", "devhub"],
|
||||
"tags": [],
|
||||
"image":"images/work/cards/work-devhub_600px.png",
|
||||
"lang":"en",
|
||||
"type":"Community"
|
||||
},
|
||||
{
|
||||
"title":"Enterprise Mobility Managers",
|
||||
"titleFriendly":"",
|
||||
"summary":"Integrate Android for Work into your enterprise mobility management (EMM) solution.",
|
||||
"url":"https://developers.google.com/android/work/",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "emm"],
|
||||
"tags": [],
|
||||
"image":"images/work/cards/work-cloud_600px.png",
|
||||
"lang":"en",
|
||||
"type":"guide"
|
||||
},
|
||||
{
|
||||
"title":"Learn More About Android for Work",
|
||||
"titleFriendly":"",
|
||||
"summary":"Learn more about how Android for Work makes your favorite phones and tablets the perfect business tools.",
|
||||
"url":"https://www.google.com/work/android/",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "emm"],
|
||||
"tags": [],
|
||||
"image":"images/work/cards/work-profile_600px.png",
|
||||
"lang":"en",
|
||||
"type":"about"
|
||||
},
|
||||
{
|
||||
"title":"Android for Work DevBytes",
|
||||
"category":"Enterprise",
|
||||
"title":"Build a Device Policy Controller",
|
||||
"titleFriendly":"",
|
||||
"summary":"Learn how to develop a Device Policy Controller to create and administer a managed profile on an employee's device.",
|
||||
"url":"https://developers.google.com/android/work/build-dpc",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "emm"],
|
||||
"tags": [],
|
||||
"image":"images/work/cards/work-folder_600px.png",
|
||||
"lang":"en",
|
||||
"type":"guide"
|
||||
},
|
||||
{
|
||||
"title":"Android for Work for Developers",
|
||||
"titleFriendly":"",
|
||||
"summary":"Watch the videos in this playlist to understand more about Android for Work and get tips on developing enterprise apps.",
|
||||
"url":"https://www.youtube.com/watch?v=jQWB_-o1kz4&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
"group":"",
|
||||
@@ -3202,11 +3310,11 @@ METADATA['en'].extras = METADATA['en'].extras.concat([
|
||||
"tags": [],
|
||||
"image":"https://i1.ytimg.com/vi/jQWB_-o1kz4/maxresdefault.jpg",
|
||||
"lang":"en",
|
||||
"type":"video"
|
||||
"type":"youtube"
|
||||
},
|
||||
{
|
||||
"title":"App Configurations, Testing and Launchers",
|
||||
"category":"Enterprise",
|
||||
"titleFriendly":"",
|
||||
"summary":"With Android for Work you can make your apps remotely configurable. We also cover how to test your app in a managed environment.",
|
||||
"url":"https://www.youtube.com/watch?v=39NkpWkaH8M&index=2&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
"group":"",
|
||||
@@ -3214,23 +3322,23 @@ METADATA['en'].extras = METADATA['en'].extras.concat([
|
||||
"tags": [],
|
||||
"image":"https://i1.ytimg.com/vi/39NkpWkaH8M/maxresdefault.jpg",
|
||||
"lang":"en",
|
||||
"type":"video"
|
||||
"type":"youtube"
|
||||
},
|
||||
{
|
||||
"title":"Building an enterprise ready app",
|
||||
"category":"Enterprise",
|
||||
"title":"Building an Enterprise Ready App",
|
||||
"titleFriendly":"",
|
||||
"summary":"A holistic view of Android for Work for developers.",
|
||||
"url":"https://www.youtube.com/watch?v=dH41OutAMNM",
|
||||
"url":"https://www.youtube.com/watch?v=dH41OutAMNM&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
"group":"",
|
||||
"keywords": ["work", "enterprise", "emm"],
|
||||
"tags": [],
|
||||
"image":"https://i1.ytimg.com/vi/dH41OutAMNM/maxresdefault.jpg",
|
||||
"lang":"en",
|
||||
"type":"video"
|
||||
"type":"youtube"
|
||||
},
|
||||
{
|
||||
"title":"Android for Work: Single Use Devices",
|
||||
"category":"Enterprise",
|
||||
"titleFriendly":"",
|
||||
"summary":"Single-purpose computers are everywhere, and Android can meet that need.",
|
||||
"url":"https://www.youtube.com/watch?v=j3QC6hcpy90",
|
||||
"group":"",
|
||||
@@ -3238,7 +3346,7 @@ METADATA['en'].extras = METADATA['en'].extras.concat([
|
||||
"tags": [],
|
||||
"image":"https://i1.ytimg.com/vi/j3QC6hcpy90/maxresdefault.jpg",
|
||||
"lang":"en",
|
||||
"type":"video"
|
||||
"type":"youtube"
|
||||
},
|
||||
{
|
||||
"title":"Discover YouTube cards",
|
||||
@@ -3908,7 +4016,7 @@ METADATA['en'].collections = {
|
||||
"resources": [
|
||||
"https://www.android.com/work/",
|
||||
"https://www.youtube.com/watch?v=jQWB_-o1kz4&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
"training/enterprise/index.html"
|
||||
"work/index.html"
|
||||
]
|
||||
},
|
||||
"distribute/essentials": {
|
||||
@@ -5078,26 +5186,6 @@ METADATA['en'].collections = {
|
||||
"training/monitoring-device-state/index.html"
|
||||
]
|
||||
},
|
||||
"training/work/apps": {
|
||||
"title": "",
|
||||
"resources": [
|
||||
"training/enterprise/app-compatibility.html",
|
||||
"training/enterprise/app-restrictions.html",
|
||||
"training/enterprise/cosu.html",
|
||||
"https://www.youtube.com/watch?v=39NkpWkaH8M&index=2&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
"samples/AppRestrictionSchema/index.html",
|
||||
"https://www.youtube.com/watch?v=dH41OutAMNM",
|
||||
"samples/AppRestrictionEnforcer/index.html"
|
||||
]
|
||||
},
|
||||
"training/work/admin": {
|
||||
"title": "",
|
||||
"resources": [
|
||||
"training/enterprise/work-policy-ctrl.html",
|
||||
"samples/BasicManagedProfile/index.html",
|
||||
"https://www.youtube.com/watch?v=j3QC6hcpy90"
|
||||
]
|
||||
},
|
||||
"tools/help/log": {
|
||||
"title": "",
|
||||
"resources": [
|
||||
@@ -5251,6 +5339,47 @@ METADATA['en'].collections = {
|
||||
"preview/features/picture-in-picture.html",
|
||||
"preview/features/tv-recording-api.html"
|
||||
]
|
||||
},
|
||||
"work/landing/primary": {
|
||||
"title": "",
|
||||
"resources": [
|
||||
"work/overview.html",
|
||||
"work/guide.html",
|
||||
"https://connect.googleforwork.com/community/applicants/android/isv",
|
||||
"work/app-restrictions.html",
|
||||
"work/cosu.html",
|
||||
"work/managed-profiles.html"
|
||||
]
|
||||
},
|
||||
"work/landing/resources": {
|
||||
"title": "",
|
||||
"resources": [
|
||||
"https://developers.google.com/android/work/",
|
||||
"https://www.google.com/work/android/",
|
||||
"https://developers.google.com/android/work/build-dpc",
|
||||
"https://www.youtube.com/watch?v=jQWB_-o1kz4&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
"https://www.youtube.com/watch?v=39NkpWkaH8M&index=2&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
"https://www.youtube.com/watch?v=dH41OutAMNM&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX"
|
||||
]
|
||||
},
|
||||
"work/apps": {
|
||||
"title": "",
|
||||
"resources": [
|
||||
"work/managed-profiles.html",
|
||||
"work/app-restrictions.html",
|
||||
"work/cosu.html",
|
||||
"https://www.youtube.com/watch?v=39NkpWkaH8M&index=2&list=PLOU2XLYxmsIKAK2Bhv19H2THwF-22O5WX",
|
||||
"samples/AppRestrictionSchema/index.html",
|
||||
"samples/AppRestrictionEnforcer/index.html"
|
||||
]
|
||||
},
|
||||
"work/admin": {
|
||||
"title": "",
|
||||
"resources": [
|
||||
"https://developers.google.com/android/work/build-dpc",
|
||||
"samples/BasicManagedProfile/index.html",
|
||||
"https://www.youtube.com/watch?v=j3QC6hcpy90"
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ var ALL_RESOURCES = mergeArrays(
|
||||
SAMPLES_RESOURCES,
|
||||
TOOLS_RESOURCES,
|
||||
TRAINING_RESOURCES,
|
||||
WORK_RESOURCES,
|
||||
YOUTUBE_RESOURCES,
|
||||
BLOGGER_RESOURCES,
|
||||
PREVIEW_RESOURCES
|
||||
@@ -74,6 +75,7 @@ var ALL_RESOURCES_BY_TYPE = {
|
||||
'tools': TOOLS_RESOURCES,
|
||||
'training': TRAINING_RESOURCES,
|
||||
'preview': PREVIEW_RESOURCES,
|
||||
'work': WORK_RESOURCES,
|
||||
'youtube': YOUTUBE_RESOURCES,
|
||||
'blog': BLOGGER_RESOURCES
|
||||
};
|
||||
@@ -112,4 +114,4 @@ for (var i = 0; i < ALL_RESOURCES.length; i++) {
|
||||
ALL_RESOURCES_BY_URL[url] = res;
|
||||
}
|
||||
}
|
||||
var IS_RESOURCE_IN_LANG = buildResourceLookupMap(ALL_RESOURCES_BY_LANG);
|
||||
var IS_RESOURCE_IN_LANG = buildResourceLookupMap(ALL_RESOURCES_BY_LANG);
|
||||
|
||||
@@ -754,18 +754,6 @@ toc:
|
||||
- name: description
|
||||
value: How to use DHU to test Auto apps.
|
||||
|
||||
- title: Building Apps for Work
|
||||
path: /training/enterprise/index.html
|
||||
section:
|
||||
- title: Ensuring Compatibility with Managed Profiles
|
||||
path: /training/enterprise/app-compatibility.html
|
||||
- title: Implementing App Restrictions
|
||||
path: /training/enterprise/app-restrictions.html
|
||||
- title: Building a Device Policy Controller
|
||||
path: /training/enterprise/work-policy-ctrl.html
|
||||
- title: Configuring Corporate-Owned, Single-Use Devices
|
||||
path: /training/enterprise/cosu.html
|
||||
|
||||
- title: Best Practices for Interaction & Engagement
|
||||
path: /training/best-ux.html
|
||||
section:
|
||||
@@ -1386,7 +1374,7 @@ toc:
|
||||
- name: description
|
||||
value: How to use the SafetyNet service to analyze a device where your app is running and get information about its compatibility with your app.
|
||||
- title: Enhancing Security with Device Management Policies
|
||||
path: /training/enterprise/device-management-policy.html
|
||||
path: /work/device-management-policy.html
|
||||
path_attributes:
|
||||
- name: description
|
||||
value: How to create an application that enforces security policies on devices.
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
page.title=Building Apps for Work
|
||||
meta.tags="work, enterprise, corporate"
|
||||
page.tags="work", "enterprise", "corporate"
|
||||
page.metaDescription=Learn how to build Android apps for the enterprise and take advantage of Google's Android for Work program.
|
||||
page.article=true
|
||||
|
||||
@jd:body
|
||||
|
||||
<iframe width="448" height="252"
|
||||
src="//www.youtube.com/embed/jQWB_-o1kz4?autohide=1&showinfo=0"
|
||||
frameborder="0" allowfullscreen=""
|
||||
style="float: right; margin: 0 0 20px 20px;"></iframe>
|
||||
|
||||
<p>
|
||||
The Android framework provides features to support the security, data separation, and
|
||||
administration needs of a enterprise environment. As an app developer, you can make your app more
|
||||
appealing to corporate customers by gracefully handling enterprise security and feature
|
||||
restrictions. You can also modify your app so that technology administrators can remotely
|
||||
configure it for use with enterprise resources.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To help businesses incorporate Android devices and apps into the workplace, Google provides the
|
||||
<a href="http://www.google.com/work/android">Android for Work</a> program, which offers a suite
|
||||
of APIs and services for device distribution and administration. Through this program companies
|
||||
can connect with Enterprise Mobility Management (EMM) providers to help integrate Android with
|
||||
their businesses.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
For more information, follow the links below to learn how to update your Android app to support
|
||||
the enterprise environment or build enterprise-specific solutions.
|
||||
</p>
|
||||
|
||||
<h2 id="apps">App Development for Enterprises</h2>
|
||||
|
||||
<p>
|
||||
Learn how to make your app function smoothly in corporate environments that restrict device
|
||||
features and data access. Go further to support enterprise use of your app by enabling
|
||||
restrictions that corporate technology administrators can use to remotely configure your app:
|
||||
</p>
|
||||
|
||||
<div class="dynamic-grid">
|
||||
<div class="resource-widget resource-flow-layout landing col-12"
|
||||
data-query="collection:training/work/apps"
|
||||
data-cardSizes="6x6"
|
||||
data-maxResults="6">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<h2 id="admin">Device and App Administration</h2>
|
||||
|
||||
<p>
|
||||
Learn how to build policy controller apps that enable enterprise technology administrators
|
||||
to manage devices, manage corporate apps, and provide access to company resources:
|
||||
</p>
|
||||
|
||||
<div class="dynamic-grid">
|
||||
<div class="resource-widget resource-flow-layout landing col-12"
|
||||
data-query="collection:training/work/admin"
|
||||
data-cardSizes="6x6"
|
||||
data-maxResults="4">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,339 +0,0 @@
|
||||
page.title=Building a Device Policy Controller
|
||||
page.metaDescription=Learn how to develop a device policy controller to create and administer a managed profile on an employee's device.
|
||||
page.tags="work policy controller,WPC,device policy controller,DPC"
|
||||
@jd:body
|
||||
|
||||
<div id="tb-wrapper">
|
||||
<div id="tb">
|
||||
|
||||
<h2>This lesson teaches you to</h2>
|
||||
<ol>
|
||||
<li><a href="#after_creating_profile">Create a Managed Profile</a></li>
|
||||
<li><a href="#set_up_policies">Set Up Device Policies</a></li>
|
||||
<li><a href="#apply_restrictions">Apply App Restrictions</a></li>
|
||||
</ol>
|
||||
|
||||
<!-- related docs (NOT javadocs) -->
|
||||
|
||||
<h2>
|
||||
You should also read
|
||||
</h2>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<a href="{@docRoot}guide/topics/admin/device-admin.html">Device
|
||||
Administration</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2>Resources</h2>
|
||||
<ul>
|
||||
|
||||
<li>
|
||||
<a href=
|
||||
"{@docRoot}samples/BasicManagedProfile/index.html">BasicManagedProfile</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href=
|
||||
"{@docRoot}samples/AppRestrictionEnforcer/index.html">AppRestrictionEnforcer</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<p>
|
||||
In an Android for Work deployment, an enterprise needs to maintain control
|
||||
over certain aspects of the employees' devices. The enterprise needs to
|
||||
ensure that work-related information is encrypted and is kept separate from
|
||||
employees' personal data. The enterprise may also need to limit device
|
||||
capabilities, such as whether the device is allowed to use its camera. And
|
||||
the enterprise may require that approved apps provide app restrictions, so
|
||||
the enterprise can turn app capability on or off as needed.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To handle these tasks, an enterprise develops and deploys
|
||||
a <em>device policy controller</em> app (previously known as a
|
||||
<em>work policy controller</em>). This app is installed on each employee's device. The
|
||||
controller app installed on each employee's device and creates a work user
|
||||
profile, which accesses enterprise apps and data separately from the user's
|
||||
personal account. The controller app also acts as the
|
||||
bridge between the enterprise's management software and the device; the
|
||||
enterprise tells the controller app when it needs to make configuration
|
||||
changes, and the controller app makes the appropriate settings changes for the
|
||||
device and for other apps.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
This lesson describes how to develop a device policy controller app for devices
|
||||
in an Android for Work deployment. The lesson describes how to create a work
|
||||
user profile, how to set device policies, and how to apply
|
||||
restrictions to other apps running on the managed profile.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
<strong>Note:</strong> This lesson does not cover the situation where the
|
||||
only profile on the device is the managed profile, under the enterprise's
|
||||
control.
|
||||
</p>
|
||||
|
||||
<h2 id="overview">Device Administration Overview</h2>
|
||||
|
||||
<p>
|
||||
In an Android for Work deployment, the enterprise administrator can set
|
||||
policies to control the behavior of employees' devices and apps. The
|
||||
enterprise administrator sets these policies with software provided by their
|
||||
Enterprise Mobility Management (EMM) provider. The EMM software communicates
|
||||
with a device policy controller on each device. The device policy controller, in
|
||||
turn, manages the settings and behavior of the work user profile on each
|
||||
individual’s device.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
<strong>Note:</strong> A device policy controller is built on the existing
|
||||
model used for device administration applications, as described in <a href=
|
||||
"{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a>.
|
||||
In particular, your app needs to create a subclass of {@link
|
||||
android.app.admin.DeviceAdminReceiver}, as described in that document.
|
||||
</p>
|
||||
|
||||
<h3 id="managed_profiles">Managed profiles</h3>
|
||||
|
||||
<p>
|
||||
Users often want to use their personal devices in an enterprise setting. This
|
||||
situation can present enterprises with a dilemma. If the user can use their
|
||||
own device, the enterprise has to worry that confidential information (like
|
||||
employee emails and contacts) are on a device the enterprise does not
|
||||
control.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To address this situation, Android 5.0 (API level 21) allows enterprises to
|
||||
set up a special work user profile using the Managed Profile API. This
|
||||
user profile is called a <em>managed profile</em>, or a <em>work profile</em>
|
||||
in the Android for Work program. If a device has a
|
||||
managed profile for work, the profile's settings are under the control of the
|
||||
enterprise administrator. The administrator can choose which apps are allowed
|
||||
for that profile, and can control just what device features are available to
|
||||
the profile.
|
||||
</p>
|
||||
|
||||
<h2 id="create_profile">Create a Managed Profile</h2>
|
||||
|
||||
<p>To create a managed profile on a device that already has a personal profile,
|
||||
first check that the device can support a managed profile, by seeing if the
|
||||
device supports the {@link
|
||||
android.content.pm.PackageManager#FEATURE_MANAGED_USERS FEATURE_MANAGED_USERS}
|
||||
system feature:</p>
|
||||
|
||||
<pre>PackageManager pm = getPackageManager();
|
||||
if (!pm.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)) {
|
||||
|
||||
// This device does not support native managed profiles!
|
||||
|
||||
}</pre>
|
||||
|
||||
<p>If the device supports managed profiles, create one by sending an intent with
|
||||
an {@link android.app.admin.DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE
|
||||
ACTION_PROVISION_MANAGED_PROFILE} action. Include the device admin package
|
||||
name as an extra.</p>
|
||||
|
||||
<pre>Activity provisioningActivity = getActivity();
|
||||
|
||||
// You'll need the package name for the WPC app.
|
||||
String myWPCPackageName = "com.example.myWPCApp";
|
||||
|
||||
// Set up the provisioning intent
|
||||
Intent provisioningIntent =
|
||||
new Intent("android.app.action.PROVISION_MANAGED_PROFILE");
|
||||
intent.putExtra(myWPCPackageName,
|
||||
provisioningActivity.getApplicationContext().getPackageName());
|
||||
|
||||
if (provisioningIntent.resolveActivity(provisioningActivity.getPackageManager())
|
||||
== null) {
|
||||
|
||||
// No handler for intent! Can't provision this device.
|
||||
// Show an error message and cancel.
|
||||
} else {
|
||||
|
||||
// REQUEST_PROVISION_MANAGED_PROFILE is defined
|
||||
// to be a suitable request code
|
||||
startActivityForResult(provisioningIntent,
|
||||
REQUEST_PROVISION_MANAGED_PROFILE);
|
||||
provisioningActivity.finish();
|
||||
}</pre>
|
||||
|
||||
<p>The system responds to this intent by doing the following:</p>
|
||||
|
||||
<ul>
|
||||
<li>Verifies that the device is encrypted. If it is not, the system prompts
|
||||
the user to encrypt the device before proceeding.
|
||||
</li>
|
||||
|
||||
<li>Creates a managed profile.
|
||||
</li>
|
||||
|
||||
<li>Removes non-required applications from the managed profile.
|
||||
</li>
|
||||
|
||||
<li>Copies the device policy controller app into the managed profile and
|
||||
sets it as the profile owner.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Override {@link android.app.Activity#onActivityResult onActivityResult()} to
|
||||
see whether the provisioning was successful, as shown in the following
|
||||
example code:</p>
|
||||
|
||||
<pre>@Override
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
|
||||
// Check if this is the result of the provisioning activity
|
||||
if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) {
|
||||
|
||||
// If provisioning was successful, the result code is
|
||||
// Activity.RESULT_OK
|
||||
if (resultCode == Activity.RESULT_OK) {
|
||||
// Hurray! Managed profile created and provisioned!
|
||||
} else {
|
||||
// Boo! Provisioning failed!
|
||||
}
|
||||
return;
|
||||
|
||||
} else {
|
||||
// This is the result of some other activity, call the superclass
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
}</pre>
|
||||
|
||||
<h3 id="after_creating_profile">After Creating the Managed Profile</h3>
|
||||
|
||||
<p>When the profile has been provisioned, the system calls the device policy
|
||||
controller app's {@link android.app.admin.DeviceAdminReceiver#onProfileProvisioningComplete
|
||||
DeviceAdminReceiver.onProfileProvisioningComplete()} method. Override this
|
||||
callback method to finish enabling the managed profile.</p>
|
||||
|
||||
<p>Typically, your {@link
|
||||
android.app.admin.DeviceAdminReceiver#onProfileProvisioningComplete
|
||||
DeviceAdminReceiver.onProfileProvisioningComplete()} callback implementation
|
||||
would perform these tasks:</p>
|
||||
|
||||
<ul>
|
||||
<li>Verify that the device is complying with the EMM's device policies, as
|
||||
described in <a href="#set_up_policies">Set Up Device Policies</a>
|
||||
</li>
|
||||
|
||||
<li>Enable any system applications that the administrator chooses to make
|
||||
available within the managed profile, using {@link
|
||||
android.app.admin.DevicePolicyManager#enableSystemApp
|
||||
DevicePolicyManager.enableSystemApp()} </li>
|
||||
|
||||
<li>If the device uses Google Play for Work, add the Google account
|
||||
to the managed profile with {@link android.accounts.AccountManager#addAccount
|
||||
AccountManager.addAccount()}, so administrators can install
|
||||
applications to the device
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Once you have completed these tasks, call the device policy manager's
|
||||
{@link android.app.admin.DevicePolicyManager#setProfileEnabled
|
||||
setProfileEnabled()} method to activate the managed profile:</p>
|
||||
|
||||
|
||||
<pre>// Get the device policy manager
|
||||
DevicePolicyManager myDevicePolicyMgr =
|
||||
(DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||
|
||||
ComponentName componentName = myDeviceAdminReceiver.getComponentName(this);
|
||||
|
||||
// Set the name for the newly created managed profile.
|
||||
myDevicePolicyMgr.setProfileName(componentName, "My New Managed Profile");
|
||||
|
||||
// ...and enable the profile
|
||||
manager.setProfileEnabled(componentName);</pre>
|
||||
|
||||
<h2 id="set_up_policies">Set Up Device Policies</h2>
|
||||
|
||||
<p>
|
||||
The device policy controller app is responsible for applying the enterprise's
|
||||
device policies. For example, a particular enterprise might require that all
|
||||
devices become locked after a certain number of failed attempts to enter the
|
||||
device password. The controller app queries the EMM to find out what
|
||||
the current policies are, then uses the <a href=
|
||||
"{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a>
|
||||
API to apply those policies.
|
||||
</p>
|
||||
|
||||
<p>For information on how to apply device policies, see the
|
||||
<a href="{@docRoot}guide/topics/admin/device-admin.html#policies">Device
|
||||
Administration</a> guide.</p>
|
||||
|
||||
|
||||
<h2 id="apply_restrictions">Apply App Restrictions</h2>
|
||||
|
||||
<p>Enterprise environments may require that approved apps implement security
|
||||
or feature restrictions. App developers must implement these restrictions
|
||||
and declare them for use by enterprise administrators, as described in
|
||||
<a href="{@docRoot}training/enterprise/app-restrictions.html">Implementing
|
||||
App Restrictions</a>. The device policy controller receives restriction changes
|
||||
from the enterprise administrator, and forwards those restriction changes to the apps.</p>
|
||||
|
||||
<p>For example, a particular news app might have a restriction setting that
|
||||
controls whether the app is allowed to download videos over a cellular
|
||||
network. When the EMM wants to disable cellular downloads, it sends a
|
||||
notification to the controller app. The controller app, in turn,
|
||||
notifies the news app that the restriction setting has changed.</p>
|
||||
|
||||
<p class="note"><strong>Note:</strong> This document covers how the device policy
|
||||
controller app changes the restriction settings for the other apps on the
|
||||
managed profile. Details on how the device policy controller app communicates with
|
||||
the EMM are out of scope for this document.</p>
|
||||
|
||||
<p>To change an app's restrictions, call the {@link
|
||||
android.app.admin.DevicePolicyManager#setApplicationRestrictions
|
||||
DevicePolicyManager.setApplicationRestrictions()} method. This method is passed
|
||||
three parameters: the controller app's {@link
|
||||
android.app.admin.DeviceAdminReceiver}, the package name of the app whose
|
||||
restrictions are being changed, and a {@link android.os.Bundle Bundle} that
|
||||
contains the restrictions you want to set.</p>
|
||||
|
||||
<p>For example, suppose there's an app on the managed profile with the package
|
||||
name <code>"com.example.newsfetcher"</code>. This app has a single boolean
|
||||
restriction that can be configured, with the key
|
||||
<code>"downloadByCellular"</code>. If this restriction is set to
|
||||
<code>false</code>, the newsfetcher app is not allowed to download data through
|
||||
a cellular network; it must use a Wi-Fi network instead.</p>
|
||||
|
||||
<p>
|
||||
If your device policy controller app needs to turn off cellular downloads, it
|
||||
would first fetch the device policy service object, as described above. It
|
||||
then assembles a restrictions bundle and passes this bundle to {@link
|
||||
android.app.admin.DevicePolicyManager#setApplicationRestrictions
|
||||
setApplicationRestrictions()}:
|
||||
</p>
|
||||
|
||||
<pre>// Fetch the DevicePolicyManager
|
||||
DevicePolicyManager myDevicePolicyMgr =
|
||||
(DevicePolicyManager) thisActivity
|
||||
.getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||
|
||||
// Set up the restrictions bundle
|
||||
bundle restrictionsBundle = new Bundle();
|
||||
restrictionsBundle.putBoolean("downloadByCellular", false);
|
||||
|
||||
// Pass the restrictions to the policy manager. Assume the WPC app
|
||||
// already has a DeviceAdminReceiver defined (myDeviceAdminReceiver).
|
||||
myDevicePolicyMgr.setApplicationRestrictions(
|
||||
myDeviceAdminReceiver, "com.example.newsfetcher", restrictionsBundle);</pre>
|
||||
|
||||
|
||||
<p class="note"><strong>Note:</strong> The device policy service conveys the restrictions
|
||||
change to the app you name. However, it is up to that app to actually implement
|
||||
the restriction. For example, in this case, the app would be responsible for
|
||||
disabling its ability to use cellular networks for video downloads. Setting the
|
||||
restriction does not cause the system to enforce this restriction on the app.
|
||||
For more information, see <a href="{@docRoot}training/enterprise/app-
|
||||
restrictions.html">Implementing App Restrictions</a>.</p>
|
||||
@@ -1187,37 +1187,6 @@
|
||||
</li>
|
||||
<!-- End: Building for Auto -->
|
||||
|
||||
|
||||
<!-- Start: Building for Work -->
|
||||
<li class="nav-section">
|
||||
<div class="nav-section-header">
|
||||
<a href="<?cs var:toroot ?>training/enterprise/index.html">
|
||||
<span class="small">Building Apps for</span><br/>
|
||||
Work
|
||||
</a>
|
||||
</div>
|
||||
<ul>
|
||||
<li><a href="<?cs var:toroot ?>training/enterprise/app-compatibility.html">
|
||||
Ensuring Compatibility with Managed Profiles
|
||||
</a>
|
||||
</li>
|
||||
<li><a href="<?cs var:toroot ?>training/enterprise/app-restrictions.html">
|
||||
Implementing App Restrictions
|
||||
</a>
|
||||
</li>
|
||||
<li><a href="<?cs var:toroot ?>training/enterprise/work-policy-ctrl.html">
|
||||
Building a Device Policy Controller
|
||||
</a>
|
||||
</li>
|
||||
<li><a href="<?cs var:toroot ?>training/enterprise/cosu.html">
|
||||
Configuring Corporate-Owned, Single-Use Devices
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<!-- End: Building for Work -->
|
||||
|
||||
|
||||
<li class="nav-section">
|
||||
<div class="nav-section-header">
|
||||
<a href="<?cs var:toroot ?>training/best-ux.html">
|
||||
@@ -2118,7 +2087,7 @@ results."
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="<?cs var:toroot ?>training/enterprise/device-management-policy.html"
|
||||
<a href="<?cs var:toroot ?>work/device-management-policy.html"
|
||||
description="How to create an application that enforces security policies on devices."
|
||||
>Enhancing Security with Device Management Policies</a>
|
||||
</li>
|
||||
|
||||
18
docs/html/work/_book.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
toc:
|
||||
- title: Android for Work Home
|
||||
path: /work/index.html
|
||||
|
||||
- title: Overview
|
||||
path: /work/overview.html
|
||||
|
||||
- title: Developer Guide
|
||||
path: /work/guide.html
|
||||
|
||||
- title: Set up Managed Profiles
|
||||
path: /work/managed-profiles.html
|
||||
|
||||
- title: Set up App Restrictions
|
||||
path: /work/app-restrictions.html
|
||||
|
||||
- title: Set up Single-Purpose Devices
|
||||
path: /work/cosu.html
|
||||
@@ -1,27 +1,18 @@
|
||||
page.title=Implementing App Restrictions
|
||||
page.title=Set up App Restrictions
|
||||
page.metaDescription=Learn how to implement app restrictions and configuration settings that can be changed by other apps on the same device.
|
||||
page.image=images/work/cards/briefcase_600px.png
|
||||
|
||||
@jd:body
|
||||
|
||||
<div id="tb-wrapper">
|
||||
<div id="tb">
|
||||
|
||||
<h2>This lesson teaches you to</h2>
|
||||
<ol>
|
||||
<li><a href="#define_restrictions">Define App Restrictions</a></li>
|
||||
<li><a href="#check_restrictions">Check App Restrictions</a></li>
|
||||
<li><a href="#listen">Listen for App Restriction Changes</a></li>
|
||||
</ol>
|
||||
|
||||
<!-- related docs (NOT javadocs) -->
|
||||
<h2>Resources</h2>
|
||||
<ul>
|
||||
<li><a href="{@docRoot}samples/AppRestrictionSchema/index.html">AppRestrictionSchema</a>
|
||||
sample app</li>
|
||||
<li><a href="{@docRoot}samples/AppRestrictionEnforcer/index.html">AppRestrictionEnforcer</a>
|
||||
sample app</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<div id="qv-wrapper">
|
||||
<div id="qv">
|
||||
<h2>In this document</h2>
|
||||
<ol>
|
||||
<li><a href="#define_restrictions">Define App Restrictions</a></li>
|
||||
<li><a href="#check_restrictions">Check App Restrictions</a></li>
|
||||
<li><a href="#listen">Listen for App Restriction Changes</a></li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p>If you are developing apps for the enterprise market, you may need to satisfy
|
||||
@@ -152,10 +143,10 @@ enterprise administrator to:</p>
|
||||
<restrictions xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
|
||||
<restriction
|
||||
android:key="download_on_cell"
|
||||
android:title="@string/download_on_cell_title"
|
||||
android:key="downloadOnCellular"
|
||||
android:title="App is allowed to download data via cellular"
|
||||
android:restrictionType="bool"
|
||||
android:description="@string/download_on_cell_description"
|
||||
android:description="If 'false', app can only download data via Wi-Fi"
|
||||
android:defaultValue="true" />
|
||||
|
||||
</restrictions>
|
||||
@@ -166,12 +157,6 @@ enterprise administrator to:</p>
|
||||
documented in the reference for {@link android.content.RestrictionsManager}.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
<strong>Note:</strong> <code>bundle</code> and
|
||||
<code>bundle_array</code> restriction types are not supported by Google Play
|
||||
for Work.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
You use each restriction's <code>android:key</code> attribute to read its
|
||||
value from a restrictions bundle. For this reason, each restriction must have
|
||||
@@ -217,7 +202,7 @@ enterprise administrator to:</p>
|
||||
</li>
|
||||
|
||||
<li>When the app is notified of a restriction change, as described in
|
||||
<a href="#listen">Listen for App Configuration
|
||||
<a href="#listen">Listen for Device Configuration
|
||||
Changes</a>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -260,30 +245,9 @@ enterprise administrator to:</p>
|
||||
the {@link android.content.Intent#ACTION_APPLICATION_RESTRICTIONS_CHANGED
|
||||
ACTION_APPLICATION_RESTRICTIONS_CHANGED} intent to find out if restrictions
|
||||
change while your app is active, as described in <a href="#listen">Listen for
|
||||
App Restriction Changes</a>.
|
||||
Device Configuration Changes</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
When your app checks for restrictions using
|
||||
{@link android.content.RestrictionsManager#getApplicationRestrictions
|
||||
RestrictionsManager.getApplicationRestrictions()}, we recommend that you
|
||||
check to see if the enterprise administrator has set the key-value pair
|
||||
{@link android.os.UserManager#KEY_RESTRICTIONS_PENDING} to true. If so, you
|
||||
should block the user from using the app, and prompt them to contact their
|
||||
enterprise administrator. The app should then proceed as normal, registering
|
||||
for the {@link android.content.Intent#ACTION_APPLICATION_RESTRICTIONS_CHANGED
|
||||
ACTION_APPLICATION_RESTRICTIONS_CHANGED} broadcast.
|
||||
</p>
|
||||
|
||||
<img src="{@docRoot}images/training/enterprise/app_restrictions_diagram.png"
|
||||
width="620" srcset="{@docRoot}images/training/enterprise/app_restrictions_diagram.png 1x,
|
||||
{@docRoot}images/training/enterprise/app_restrictions_diagram_2x.png 2x" />
|
||||
|
||||
<p class="img-caption">
|
||||
<strong>Figure 1.</strong> Checking whether restrictions are pending before
|
||||
registering for the broadcast.
|
||||
</p>
|
||||
|
||||
<h3 id="read_restrictions">
|
||||
Reading and applying restrictions
|
||||
</h3>
|
||||
@@ -293,11 +257,11 @@ width="620" srcset="{@docRoot}images/training/enterprise/app_restrictions_diagra
|
||||
getApplicationRestrictions()} method returns a {@link android.os.Bundle}
|
||||
containing a key-value pair for each restriction that has been set. The
|
||||
values are all of type <code>Boolean</code>, <code>int</code>,
|
||||
<code>String</code>, <code>String[]</code>, <code>Bundle</code>, and
|
||||
<code>Bundle[]</code>. Once you have the restrictions {@link android.os.Bundle},
|
||||
you can check the current restrictions settings with the standard
|
||||
{@link android.os.Bundle} methods for those data types, such as
|
||||
{@link android.os.Bundle#getBoolean getBoolean()} or
|
||||
<code>String</code>, and <code>String[]</code>. Once you have the
|
||||
restrictions {@link android.os.Bundle}, you can check the current
|
||||
restrictions settings with the standard {@link android.os.Bundle} methods for
|
||||
those data types, such as {@link android.os.Bundle#getBoolean getBoolean()}
|
||||
or
|
||||
{@link android.os.Bundle#getString getString()}.
|
||||
</p>
|
||||
|
||||
@@ -311,11 +275,10 @@ width="620" srcset="{@docRoot}images/training/enterprise/app_restrictions_diagra
|
||||
|
||||
<p>
|
||||
It is up to your app to take appropriate action based on the current
|
||||
restrictions settings. For example, if your app has a restriction schema
|
||||
to specify whether it can download over a cellular connection (like the
|
||||
example in <a href="#define_restrictions">Define App Restrictions</a>),
|
||||
and you find that the restriction is set to false, you would have to disable
|
||||
data download except when the device has a Wi-Fi connection, as shown in the
|
||||
restrictions settings. For example, if your app has a restriction specifying
|
||||
whether it can download data over a cellular connection, and you find that
|
||||
the restriction is set to <code>false</code>, you would have to disable data
|
||||
download except when the device has a Wi-Fi connection, as shown in the
|
||||
following example code:
|
||||
</p>
|
||||
|
||||
@@ -335,13 +298,6 @@ if (!appCanUseCellular) {
|
||||
// ...show appropriate notices to user
|
||||
}</pre>
|
||||
|
||||
<p class="note">
|
||||
<strong>Note:</strong> The restrictions schema should be
|
||||
backward and forward compatible, since Google Play for Work
|
||||
gives the EMM only one version of the App Restrictions
|
||||
Schema per app.
|
||||
</p>
|
||||
|
||||
<h2 id="listen">
|
||||
Listen for App Restriction Changes
|
||||
</h2>
|
||||
@@ -389,8 +345,8 @@ registerReceiver(restrictionsReceiver, restrictionsFilter);
|
||||
<strong>Note:</strong> Ordinarily, your app does not need to be notified
|
||||
about restriction changes when it is paused. Instead, you should unregister
|
||||
your broadcast receiver when the app is paused. When the app resumes, you
|
||||
first check for the current restrictions (as discussed in
|
||||
<a href="#check_restrictions">Check App Restrictions</a>), then register
|
||||
your broadcast receiver to make sure you're notified about restriction changes
|
||||
first check for the current restrictions (as discussed in <a href=
|
||||
"#check_restrictions">Check Device Restrictions</a>), then register your
|
||||
broadcast receiver to make sure you're notified about restriction changes
|
||||
that happen while the app is active.
|
||||
</p>
|
||||
@@ -1,27 +1,20 @@
|
||||
page.title=Configuring Corporate-Owned, Single-Use Devices
|
||||
page.title=Set up Single-Purpose Devices
|
||||
page.tags=work, cosu
|
||||
page.keywords=cosu, work
|
||||
page.metaDescription=Learn how to develop single-use solutions for Android devices.
|
||||
page.image=images/work/cards/briefcase_600px.png
|
||||
|
||||
@jd:body
|
||||
|
||||
<div id="tb-wrapper">
|
||||
<div id="tb">
|
||||
|
||||
<h2>This lesson teaches you to</h2>
|
||||
<ol>
|
||||
<li><a href="#locktask">How to use LockTask mode</a></li>
|
||||
<li><a href="#cosu-solutions">Build COSU solutions</a></li>
|
||||
<li><a href="#create-dpc">Create your own DPC app</a></li>
|
||||
</ol>
|
||||
|
||||
<!-- related docs (NOT javadocs) -->
|
||||
<h2>You should also read</h2>
|
||||
<ul>
|
||||
<li><a href="{@docRoot}training/enterprise/work-policy-ctrl.html">
|
||||
Building a Device Policy Controller</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<div id="qv-wrapper">
|
||||
<div id="qv">
|
||||
<h2>In this document</h2>
|
||||
<ol>
|
||||
<li><a href="#locktask">How to use LockTask mode</a></li>
|
||||
<li><a href="#cosu-solutions">Build COSU solutions</a></li>
|
||||
<li><a href="#create-dpc">Create your own DPC app</a></li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
@@ -73,9 +66,9 @@ a more robust way to manage COSU devices, as discussed below.
|
||||
This graphic compares the features of app pinning and lock task mode:
|
||||
</p>
|
||||
|
||||
<img src="{@docRoot}images/training/enterprise/pinning_vs_locktaskmode.png"
|
||||
width="640" srcset="{@docRoot}images/training/enterprise/pinning_vs_locktaskmode.png 1x,
|
||||
{@docRoot}images/training/enterprise/pinning_vs_locktaskmode_2x.png 2x" />
|
||||
<img src="{@docRoot}images/work/cosu-pinning_vs_locktaskmode.png"
|
||||
width="640" srcset="{@docRoot}images/work/cosu-pinning_vs_locktaskmode.png 1x,
|
||||
{@docRoot}images/work/cosu-pinning_vs_locktaskmode_2x.png 2x" />
|
||||
|
||||
<p class="img-caption">
|
||||
<strong>Figure 1.</strong> Comparing the features of app pinning in Lollipop
|
||||
@@ -422,7 +415,7 @@ public class CosuActivity extends Activity {
|
||||
// set System Update policy
|
||||
|
||||
if (active){
|
||||
mDevicePolicyManager.setSystemUpdatePolicy(mAdminComponentName,
|
||||
mDevicePolicyManager.setSystemUpdatePolicy(mAdminComponentName,
|
||||
SystemUpdatePolicy.createWindowedInstallPolicy(60,120));
|
||||
}
|
||||
else
|
||||
@@ -431,7 +424,7 @@ public class CosuActivity extends Activity {
|
||||
// set this Activity as a lock task package
|
||||
|
||||
mDevicePolicyManager.setLockTaskPackages(mAdminComponentName,
|
||||
active ? new String[]{getPackageName()} : new String[]{});
|
||||
active ? new String[]{getPackageName()} : new String[]{});
|
||||
|
||||
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MAIN);
|
||||
intentFilter.addCategory(Intent.CATEGORY_HOME);
|
||||
@@ -460,18 +453,18 @@ public class CosuActivity extends Activity {
|
||||
}
|
||||
|
||||
private void enableStayOnWhilePluggedIn(boolean enabled) {
|
||||
if (enabled) {
|
||||
mDevicePolicyManager.setGlobalSetting(
|
||||
mAdminComponentName,
|
||||
Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
|
||||
BatteryManager.BATTERY_PLUGGED_AC
|
||||
| BatteryManager.BATTERY_PLUGGED_USB
|
||||
| BatteryManager.BATTERY_PLUGGED_WIRELESS);
|
||||
} else {
|
||||
mDevicePolicyManager.setGlobalSetting(
|
||||
mAdminComponentName,
|
||||
Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0);
|
||||
}
|
||||
if (enabled) {
|
||||
mDevicePolicyManager.setGlobalSetting(
|
||||
mAdminComponentName,
|
||||
Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
|
||||
BatteryManager.BATTERY_PLUGGED_AC
|
||||
| BatteryManager.BATTERY_PLUGGED_USB
|
||||
| BatteryManager.BATTERY_PLUGGED_WIRELESS);
|
||||
} else {
|
||||
mDevicePolicyManager.setGlobalSetting(
|
||||
mAdminComponentName,
|
||||
Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ parent.link=index.html
|
||||
<h2>Try it out</h2>
|
||||
|
||||
<div class="download-box">
|
||||
<a href="http://developer.android.com/shareables/training/DeviceManagement.zip"
|
||||
<a href="{@docRoot}shareables/training/DeviceManagement.zip"
|
||||
class="button">Download the sample</a>
|
||||
<p class="filename">DeviceManagement.zip</p>
|
||||
</div>
|
||||
530
docs/html/work/guide.jd
Normal file
@@ -0,0 +1,530 @@
|
||||
page.title=Android for Work Developer Guide
|
||||
page.tags="work", "android for work", "afw", "developer", "android"
|
||||
page.metaDescription=Android for Work provides organizations with a secure, flexible, and unified Android mobility platform combining devices, applications, and management.
|
||||
page.image=images/work/cards/android-studio_600px.png
|
||||
|
||||
@jd:body
|
||||
|
||||
<div id="qv-wrapper">
|
||||
<div id="qv">
|
||||
<h2>In this document</h2>
|
||||
<ul>
|
||||
<li><a href="#managed-profiles">Managed Profiles</a></li>
|
||||
<li><a href="#app-restrictions">Implementing App Restrictions</a></li>
|
||||
<li><a href="#cosu">COSU Devices</a></li>
|
||||
<li><a href="#sso">Set up Single Sign-on with Chrome Custom Tabs</a></li>
|
||||
<li><a href="#testing">Test Your App</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
Android for Work provides organizations with a secure, flexible, and
|
||||
unified Android mobility platform—combining devices, applications,
|
||||
and management. By default, Android apps are compatible with Android
|
||||
for Work. However, there are additional features you can use to make
|
||||
your Android app work best on a managed device:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<a href="#managed-profiles">Managed profile compatibility</a>—Modify your Android
|
||||
app so it functions best on an Android device with a work profile.
|
||||
</li>
|
||||
<li>
|
||||
<a href="#app-restrictions">Managed configuration using app restrictions</a>—Modify
|
||||
your app to allow IT administrators the option to specify custom
|
||||
settings for your apps.
|
||||
</li>
|
||||
<li>
|
||||
<a href="#cosu">Corporate-owned, single-use (COSU)</a>—Optimize your
|
||||
app so that it can be deployed on an Android device as a kiosk.
|
||||
</li>
|
||||
<li>
|
||||
<a href="#sso">Single Sign-On (SSO)</a>—Simplify the sign-on process
|
||||
for users signing in to different apps on their Android device
|
||||
running Android for Work.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3>Prerequisites</h3>
|
||||
|
||||
<ol>
|
||||
<li>You’ve created an Android app.</li>
|
||||
<li>You’re ready to modify your app so that it works best with
|
||||
Android for Work.</li>
|
||||
<li>Minimum version: Android 5.0 Lollipop recommended version:
|
||||
Android 6.0 Marshmallow and later.</li>
|
||||
</ol>
|
||||
|
||||
<p>
|
||||
<strong>Note:</strong> Android for Work functions natively on most
|
||||
Android 5.0 devices; however, Android 6.0 and later offers
|
||||
additional features for Android for Work, especially with regard to
|
||||
COSU.
|
||||
</p>
|
||||
|
||||
<h2 id="managed-profiles">Manage Profiles</h2>
|
||||
|
||||
<p>
|
||||
You can manage a user’s business data and applications through a
|
||||
work profile. A work profile is a managed corporate profile
|
||||
associated with the primary user account on an Android device. A
|
||||
work profile securely isolates work apps and data from personal apps
|
||||
and data. This work profile is in a separate container from the
|
||||
personal profile, which your user controls. These separate profiles
|
||||
allow organizations to manage the business data they care about, but
|
||||
leave everything else on a user’s device under the user’s control.
|
||||
For a deep dive into best practices, see the
|
||||
<a href="{@docRoot}work/managed-profiles.html">Set up Managed Profiles</a>
|
||||
guide. For an overview of those best practices, see below.
|
||||
</p>
|
||||
|
||||
<h3>Key features of a managed profile</h3>
|
||||
|
||||
<ul>
|
||||
<li>Separate and secure profile</li>
|
||||
<li>Google Play for Work for application distribution</li>
|
||||
<li>Separate badged work applications</li>
|
||||
<li>Profile-only management capabilities controlled by an administrator</li>
|
||||
</ul>
|
||||
|
||||
<h3>Managed profile benefits on Android 5.0+</h3>
|
||||
|
||||
<ul>
|
||||
<li>Full device encryption</li>
|
||||
<li>One Android application package (APK) for both profiles when
|
||||
there’s a personal profile and a work profile present on the device</li>
|
||||
<li><a href="https://support.google.com/work/android/answer/6192678"
|
||||
>Device policy controller</a> (DPC) is limited to the managed profile</li>
|
||||
<li>Device administration via the
|
||||
<a href="{@docRoot}reference/android/app/admin/DevicePolicyManager.html"
|
||||
>DevicePolicyManager</a> class</li>
|
||||
</ul>
|
||||
|
||||
<h3>Considerations for managed profiles</h3>
|
||||
<ul>
|
||||
<li>The Android system prevents intents
|
||||
<a href="{@docRoot}reference/android/app/admin/DevicePolicyManager.html#clearCrossProfileIntentFilters(android.content.ComponentName)"
|
||||
>from crossing profiles</a> and IT administrators can
|
||||
<a href="{@docRoot}reference/android/app/admin/DevicePolicyManager.html#enableSystemApp(android.content.ComponentName,%20java.lang.String)"
|
||||
>enable or disable system apps</a>.</li>
|
||||
<li>A file path (Uniform Resource Identifier [URI]) that’s valid on
|
||||
one profile may not be valid on the other.</li>
|
||||
</ul>
|
||||
|
||||
<h3>Prevent intents from failing between profiles</h3>
|
||||
<p>
|
||||
It’s difficult to know which intents can cross between profiles, and
|
||||
which ones are blocked. The only way to know for sure is by testing.
|
||||
Before your app starts an activity, you should verify that the
|
||||
request is resolved by calling
|
||||
<a href="{@docRoot}reference/android/content/Intent.html#resolveActivity(android.content.pm.PackageManager)"
|
||||
><code>Intent.resolveActivity()</code></a>.
|
||||
<ul>
|
||||
<li>If it returns <code>null</code>, the request doesn’t resolve.</li>
|
||||
<li>If it returns something, it shows that the intent resolves,
|
||||
and it’s safe to send the intent.</li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
<strong>Note</strong>: For detailed testing instructions, see
|
||||
<a href="{@docRoot}work/managed-profiles.html#prevent_failed_intents"
|
||||
>Prevent Failed Intents</a>.
|
||||
</p>
|
||||
|
||||
<h3>Share files across profiles</h3>
|
||||
<p>
|
||||
Some developers use URIs to mark file paths in Android. However,
|
||||
with Android for Work, because there are separate profiles, we
|
||||
recommend:
|
||||
</p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td style="white-space:nowrap;">
|
||||
<strong>Use:</strong><br/>
|
||||
Content URIs
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>
|
||||
The <a href="{@docRoot}reference/android/content/ContentUris.html"
|
||||
>content URIs</a> contain the authority, path, and ID for a
|
||||
specific file. You can generate this using
|
||||
<a href="{@docRoot}reference/android/support/v4/content/FileProvider.html"
|
||||
>FileProvider</a> subclass.
|
||||
<a href="{@docRoot}training/secure-file-sharing/index.html">Learn more</a>
|
||||
</li>
|
||||
<li>
|
||||
Share and grant permissions to access the content URI using
|
||||
an Intent. Permissions can only be passed across the profile
|
||||
boundary using Intents. If you grant another app access rights
|
||||
to your file using
|
||||
<a href="{@docRoot}reference/android/content/Context.html#grantUriPermission(java.lang.String,%20android.net.Uri,%20int)"
|
||||
><code>Context.grantUriPermission()</code></a>, it only is granted for
|
||||
that app in the same profile.</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="white-space:nowrap;">
|
||||
<strong>Don't use:</strong><br/>
|
||||
File URI
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>Contains the absolute path of the file on the device’s
|
||||
storage.</li>
|
||||
<li>A file path URI that’s valid on one profile isn’t valid on
|
||||
the other.</li>
|
||||
<li>If you attach a file URI to an intent, a handler is unable
|
||||
to access the file in another profile.</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>
|
||||
<strong>Next steps</strong>: Once your app supports managed
|
||||
profiles, test it in a work profile. See
|
||||
<a href="#testing">Test your app with Android for Work</a>.
|
||||
</p>
|
||||
|
||||
<h2 id="app-restrictions">Implementing App Restrictions</h2>
|
||||
|
||||
<p>
|
||||
App restrictions are a set of instructions that IT administrators
|
||||
can use to manage their users’ mobile devices in a specific way.
|
||||
These instructions are universal and work across any EMM, allowing
|
||||
administrators to remotely configure applications on their users’
|
||||
phones.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
If you’re developing apps for business or government, you may need
|
||||
to satisfy your industry’s specific set of requirements. Using
|
||||
application restrictions, the IT administrator can remotely specify
|
||||
settings and enforce policies for their users’ Android apps; for
|
||||
example:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>Configure if an app can sync data via cellular/3G, or only Wi-Fi</li>
|
||||
<li>Whitelist or blacklist URLs on a web browser</li>
|
||||
<li>Configure an app's email settings</li>
|
||||
<li>Enable or disable printing</li>
|
||||
<li>Manage bookmarks</li>
|
||||
</ul>
|
||||
|
||||
<h3>Best practices for implementing app restrictions</h3>
|
||||
|
||||
<p>
|
||||
The <a href="{@docRoot}work/app-restrictions.html">Set up App Restrictions</a>
|
||||
guide is the key source for information on how to build and deploy
|
||||
app restrictions. After you’ve reviewed this documentation, see
|
||||
recommendations below for additional guidance.
|
||||
</p>
|
||||
|
||||
<h4>When first launching the app</h4>
|
||||
<p>
|
||||
As soon as you launch an application, you can see if app
|
||||
restrictions are already set for this app in <code>onStart()</code> or
|
||||
<code>onResume()</code>. Additionally, you can find out if your
|
||||
application is managed or unmanaged. For example, if
|
||||
<a href="{@docRoot}reference/android/content/RestrictionsManager.html#getApplicationRestrictions()"
|
||||
><code>getApplicationRestrictions()</code></a> returns:
|
||||
<ul>
|
||||
<li><strong>A set of application-specific restrictions</strong>—You
|
||||
can configure the app restrictions silently (without requiring
|
||||
user input).</li>
|
||||
<li><strong>An empty bundle</strong>—Your application acts like
|
||||
it’s unmanaged (for example, how the app behaves in a personal
|
||||
profile).</li>
|
||||
<li><strong>A bundle with a single key value pair with
|
||||
<a href="{@docRoot}reference/android/os/UserManager.html#KEY_RESTRICTIONS_PENDING"
|
||||
><code>KEY_RESTRICTIONS_PENDING</code></a> set to true</strong>—your
|
||||
application is being managed, but the DPC isn’t configured
|
||||
correctly. You should block this user from your app, and direct
|
||||
them to their IT administrator.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<h4>Listen for changes to app restrictions</h4>
|
||||
<p>
|
||||
IT administrators can change app restrictions and what policies they
|
||||
want to enforce on their users at any time. Because of this, we
|
||||
recommend you ensure that your app can accept new restrictions as
|
||||
follows:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Fetch restrictions on launch</strong>—Your app should
|
||||
call <code>getApplicationRestrictions()</code> in <code>onStart()</code>
|
||||
and <code>onResume()</code>, and compare against old restrictions
|
||||
to see if changes are required.</li>
|
||||
<li><strong>Listen while running</strong>—Dynamically register
|
||||
<a href="{@docRoot}reference/android/content/Intent.html#ACTION_APPLICATION_RESTRICTIONS_CHANGED"
|
||||
><code>ACTION_APPLICATION_RESTRICTIONS_CHANGED</code></a> in your
|
||||
running activities or services, after you’ve checked for new
|
||||
restrictions. This intent is sent only to listeners that are
|
||||
dynamically registered, and not to listeners declared in the app
|
||||
manifest.</li>
|
||||
<li><strong>Unregister while not running</strong>—In <code>onPause()</code>,
|
||||
you should unregister for the broadcast of
|
||||
<code>ACTION_APPLICATION_RESTRICTIONS_CHANGED</code>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="cosu">COSU Devices</h2>
|
||||
|
||||
<p>
|
||||
Corporate-owned, single-use devices (COSU) are kiosk devices used
|
||||
for a single purpose, such as digital signage displays, ticket
|
||||
printing kiosks, or checkout registers.
|
||||
</p>
|
||||
<p>
|
||||
When an Android device is configured as a COSU device, the user sees
|
||||
an application locked to the screen with no Home or Recent Apps
|
||||
buttons to escape the app. COSU can also be configured to show a set
|
||||
of applications, such as a library kiosk with an app for the library
|
||||
catalog and a web browser.
|
||||
</p>
|
||||
<p>
|
||||
For instructions, see
|
||||
<a href="{@docRoot}work/cosu.html">Set up Single-Purpose Devices</a>.
|
||||
</p>
|
||||
|
||||
<h2 id="sso">Set up Single Sign-on with Chrome Custom Tabs</h2>
|
||||
|
||||
<p>
|
||||
Enterprise users often have multiple apps on their device, and they
|
||||
prefer to sign in once to access all of their work applications.
|
||||
Typically, users sign in through a
|
||||
<a href="https://developer.chrome.com/multidevice/webview/overview">WebView</a>;
|
||||
however, there are a couple reasons why this isn’t ideal:
|
||||
</p>
|
||||
<ol>
|
||||
<li>
|
||||
Users often need to sign in multiple times with the same
|
||||
credentials. The WebView solution often isn’t a true Single
|
||||
Sign-On (SSO) experience.
|
||||
</li>
|
||||
<li>
|
||||
There can be security risks, including malicious applications
|
||||
inspecting cookies or injecting JavaScript® to access a user’s
|
||||
credentials. Even trusted developers are at risk if they rely on
|
||||
potentially malicious third-party SDKs.
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<p>
|
||||
A solution to both problems is to authenticate users using Chrome
|
||||
Custom Tabs, instead of WebView. This ensures that authentication:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Occurs in a secure context (the system browser) where the host app
|
||||
cannot inspect contents.
|
||||
</li>
|
||||
<li>
|
||||
Has a shared cookie state, ensuring the user has to sign in only
|
||||
once.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3>Requirements</h3>
|
||||
|
||||
<p>
|
||||
Chrome Custom Tabs are supported using Platform APIs from API level
|
||||
23 (Android 6.0), and support libraries back to API level 4 (Android
|
||||
1.6). To implement Chrome Custom Tabs, you need to use a supported
|
||||
browser, such as Chrome 45 or later.
|
||||
</p>
|
||||
|
||||
<h3>How do I implement Chrome Custom Tabs?</h3>
|
||||
|
||||
<p>
|
||||
Google, in conjunction with the OpenID Foundation, has published an
|
||||
open source library on GitHub. To set up Chrome Custom Tabs for SSO,
|
||||
see the <a href="https://github.com/openid/AppAuth-Android"
|
||||
>documentation and sample code on GitHub</a>.
|
||||
</p>
|
||||
|
||||
<h2 id="testing">Test your App with Android for Work</h2>
|
||||
|
||||
<p>
|
||||
Once you’ve developed your app, you’ll want to test it in a work
|
||||
profile—both as a profile owner and device owner. See the
|
||||
instructions below.
|
||||
</p>
|
||||
|
||||
<h3>Use TestDPC to test your Android app</h3>
|
||||
|
||||
<p>
|
||||
TestDPC is a tool you can use to test your Android app in a variety
|
||||
of Android for Work environments. You can configure it as a profile
|
||||
owner or a device owner to launch management APIs on your device,
|
||||
using one of these methods:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Download the source code for TestDPC from
|
||||
<a href="https://github.com/googlesamples/android-testdpc">GitHub</a>.</li>
|
||||
<li>Install TestDPC directly from
|
||||
<a href="https://play.google.com/store/apps/details?id=com.afwsamples.testdpc"
|
||||
>Google Play</a>.</li>
|
||||
</ul>
|
||||
<p>
|
||||
For more information on how to configure TestDPC, see the
|
||||
instructions below and the
|
||||
<a href="https://github.com/googlesamples/android-testdpc">TestDPC User Guide</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<strong>REQUIRED</strong>: Your test Android device needs to run
|
||||
Android 5.0 or later and be able to natively support Android for Work.
|
||||
</p>
|
||||
|
||||
<h3>Provision a profile owner</h3>
|
||||
|
||||
<p>
|
||||
To test your app in a work profile, you need to first provision a
|
||||
profile owner on the TestDPC app:
|
||||
</p>
|
||||
|
||||
<ol>
|
||||
<li>Launch the TestDPC app and click <strong>Set up profile</strong>.</li>
|
||||
<li>When prompted, click <strong>Set up</strong>, ensuring the
|
||||
TestDPC’s logo is highlighted on the screen.</li>
|
||||
<li>If your device isn’t encrypted, you need to encrypt your device.
|
||||
Follow the briefcase notification after reboot to continue
|
||||
provisioning.<br/>
|
||||
Once you’ve provisioned the profile owner correctly, badged
|
||||
applications appear at the end of your app tray. Install your app
|
||||
on the device and test to see how it runs in the work profile.
|
||||
</li>
|
||||
<li>
|
||||
Install your app on the device and test to see how it runs in the
|
||||
work profile.
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<h3>Provision a device owner</h3>
|
||||
|
||||
<p>
|
||||
Testing your app as a device owner requires more steps than testing
|
||||
as a profile owner. You first need to provision the device owner on
|
||||
your test device using the
|
||||
<a href="{@docRoot}samples/NfcProvisioning/index.html"
|
||||
>NfcProvisioning sample app</a>. For complete instructions to
|
||||
provision TestDPC in device owner mode using the NfcProvisioning
|
||||
app, see the <a href="https://github.com/googlesamples/android-testdpc"
|
||||
>TestDPC User Guide</a>.
|
||||
</p>
|
||||
|
||||
<ol>
|
||||
<li>Download the <a href="{@docRoot}samples/NfcProvisioning/index.html"
|
||||
>NfcProvisioning</a> app sample files to your development environment.</li>
|
||||
<li>Unpack the project, open your shell, and <code>cd</code> to the project directory.</li>
|
||||
<li>Add a file to the directory with the <code>local.properties</code> name
|
||||
and the following content:
|
||||
<pre>sdk.dir=/path/to/your/android/sdk</pre>
|
||||
</li>
|
||||
<li>While in the project directory, enter these commands to build the NfcProvisioning APK:
|
||||
<pre>./gradlew init
|
||||
./gradlew build</pre>
|
||||
The NfcProvisioning APK you need is now located in <code>./Application/build/outputs/apk</code>.
|
||||
</li>
|
||||
<li>Install the APK on your programmer device, which you can use to provision other devices.</li>
|
||||
<li>Create a text file called <code>nfcprovisioning.txt</code> and
|
||||
include the following information:
|
||||
<pre>android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME=com.afwsamples.testdpc
|
||||
android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION=https://testdpc-latest-apk.appspot.com
|
||||
android.app.extra.PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM=gJD2YwtOiWJHkSMkkIfLRlj-quNqG1fb6v100QmzM9w=
|
||||
# note: checksum must be URL-safe
|
||||
android.app.extra.PROVISIONING_LOCALE=en_US
|
||||
android.app.extra.PROVISIONING_TIME_ZONE=America/New_York</pre>
|
||||
<p>
|
||||
<strong>Note:</strong> If you’re developing for Android 5.0
|
||||
Lollipop, see the instructions in the
|
||||
<a href="https://github.com/googlesamples/android-testdpc"
|
||||
>TestDPC User Guide</a>.
|
||||
</p>
|
||||
</li>
|
||||
<li>Push that text file to your programmer device by entering:
|
||||
<pre>adb push <path-to-nfcprovisioning.txt> /sdcard/</pre>
|
||||
</li>
|
||||
<li>
|
||||
Ensure that the programmer device is connected to Wi-Fi on either
|
||||
an unsecured or WPA2 secured network.
|
||||
<p>
|
||||
The NFC Provisioning app will automatically pass those Wi-Fi
|
||||
credentials onto the target device.
|
||||
</p>
|
||||
</li>
|
||||
<li>Open the NFC Provisioning app and ensure <code>com.google.android.testdpc</code>
|
||||
is auto-populated.</li>
|
||||
<li>Bump the devices to transfer the data.</li>
|
||||
<li>Follow the onscreen instructions to set up your target device.</li>
|
||||
<li>Once you’ve completed provisioning the device owner, you can test your app on that device. You
|
||||
should specifically test how
|
||||
<a href="{@docRoot}work/app-restrictions.html">app restrictions</a>,
|
||||
<a href="{@docRoot}work/managed-profiles.html#sharing_files">URIs</a>, and
|
||||
<a href="{@docRoot}work/managed-profiles.html#prevent_failed_intents">intents</a>
|
||||
work on that device.</li>
|
||||
</ol>
|
||||
|
||||
<h3>End-to-end testing</h3>
|
||||
|
||||
<p>
|
||||
After you’ve finished testing your app in the environments above,
|
||||
you’ll likely want to test your app in an end-to-end production
|
||||
environment. This process includes the steps a customer needs to
|
||||
take to deploy your app in their organization, including:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>App distribution through Play</li>
|
||||
<li>Server-side app restriction configuration</li>
|
||||
<li>Server-side profile policy control</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
You need to access an EMM console to complete the end-to-end
|
||||
testing. The easiest way to get one is to request a testing console
|
||||
from your EMM. Once you have access, complete these tasks:
|
||||
</p>
|
||||
|
||||
<ol>
|
||||
<li>Create a test version of your application with a
|
||||
<a href="http://tools.android.com/tech-docs/new-build-system/applicationid-vs-packagename"
|
||||
>new ApplicationId</a>.</li>
|
||||
<li>Claim a <a href="https://support.google.com/work/android/answer/6174056"
|
||||
>managed Google domain</a> and bind it to your EMM. If you
|
||||
already have a testing domain that’s bound to an EMM, you may need
|
||||
to unbind it to test it with your preferred EMM. Please consult your
|
||||
EMM for the specific unbinding steps.</li>
|
||||
<li><a href="https://support.google.com/a/answer/2494992"
|
||||
>Publish your application to the private channel</a> for their
|
||||
managed Google domain.</li>
|
||||
<li>Use the EMM console and EMM application to:
|
||||
<ol>
|
||||
<li>Set up work devices.</li>
|
||||
<li>Distribute your application.</li>
|
||||
<li>Set application restrictions.</li>
|
||||
<li>Set device policies.</li>
|
||||
</ol>
|
||||
</ol>
|
||||
|
||||
<p>
|
||||
This process will differ based on your EMM. Please consult your
|
||||
EMM’s documentation for further details. Congrats! You’ve completed
|
||||
these steps and verified that your app works well with Android for
|
||||
Work.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="https://connect.googleforwork.com/community/applicants/android/isv">
|
||||
<span class="dac-sprite dac-auto-chevron"></span>
|
||||
Learn about the Android for Work DevHub.
|
||||
</a>
|
||||
</p>
|
||||
55
docs/html/work/index.jd
Normal file
@@ -0,0 +1,55 @@
|
||||
page.title=Android for Work
|
||||
page.tags="android for work, work",
|
||||
meta.tags="android for work, work",
|
||||
fullpage=true
|
||||
section.landing=true
|
||||
header.hide=1
|
||||
footer.hide=1
|
||||
@jd:body
|
||||
|
||||
<section class="dac-expand dac-hero dac-light" >
|
||||
<div class="wrap">
|
||||
<div class="cols dac-hero-content">
|
||||
<div class="col-9of16 col-push-7of16 dac-hero-figure">
|
||||
<img class="dac-hero-image" src="{@docRoot}images/work/hero_650px_2x.png"
|
||||
srcset="{@docRoot}images/work/hero_650px.png 1x,
|
||||
{@docRoot}images/work/hero_650px_2x.png 2x">
|
||||
</div>
|
||||
<div class="col-7of16 col-pull-9of16">
|
||||
<h1 class="dac-hero-title">Android for Work</h1>
|
||||
<p class="dac-hero-description">
|
||||
Develop apps for Android for Work to take advantage of
|
||||
security and management features built into Android.
|
||||
</p>
|
||||
|
||||
<a class="dac-hero-cta" href="{@docRoot}work/overview.html">
|
||||
<span class="dac-sprite dac-auto-chevron"></span>
|
||||
Get Started
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dac-section dac-small">
|
||||
<div class="resource-widget resource-flow-layout col-16"
|
||||
data-query="collection:work/landing/primary"
|
||||
data-cardSizes="6x2"
|
||||
data-maxResults="6"></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="wrap dac-offset-parent">
|
||||
<a class="dac-fab dac-scroll-button" data-scroll-button href="#resources">
|
||||
<i class="dac-sprite dac-arrow-down-gray"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<section class="dac-section dac-gray dac-small" id="resources">
|
||||
<div class="wrap">
|
||||
<h2 class="norule">Resources</h1>
|
||||
|
||||
<div class="resource-widget resource-flow-layout col-16"
|
||||
data-query="collection:work/landing/resources"
|
||||
data-cardSizes="6x6"
|
||||
data-maxResults="16"></div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -1,26 +1,19 @@
|
||||
page.title=Ensuring Compatibility with Managed Profiles
|
||||
page.title=Set up Managed Profiles
|
||||
page.metaDescription=Learn how to make sure your apps operate smoothly in a corporate environment by following some best practices.
|
||||
page.image=images/work/cards/briefcase_600px.png
|
||||
|
||||
@jd:body
|
||||
|
||||
<div id="tb-wrapper">
|
||||
<div id="tb">
|
||||
|
||||
<h2>This lesson teaches you to</h2>
|
||||
<ol>
|
||||
<li><a href="#prevent_failed_intents">Prevent Failed Intents</a></li>
|
||||
<li><a href="#sharing_files">Share Files Across Profiles</a></li>
|
||||
<li><a href="#testing_apps">Test your App for Compatibility with Managed
|
||||
Profiles</a></li>
|
||||
</ol>
|
||||
|
||||
<!-- related docs (NOT javadocs) -->
|
||||
<h2>Resources</h2>
|
||||
<ul>
|
||||
<li><a href="{@docRoot}samples/BasicManagedProfile/index.html">BasicManagedProfile</a></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<div id="qv-wrapper">
|
||||
<div id="qv">
|
||||
<h2>In this document</h2>
|
||||
<ol>
|
||||
<li><a href="#prevent_failed_intents">Prevent Failed Intents</a></li>
|
||||
<li><a href="#sharing_files">Share Files Across Profiles</a></li>
|
||||
<li><a href="#testing_apps">
|
||||
Test your App for Compatibility with Managed Profiles</a></li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p>The Android platform allows devices to have
|
||||
142
docs/html/work/overview.jd
Normal file
@@ -0,0 +1,142 @@
|
||||
page.title=Android for Work Developer Overview
|
||||
meta.tags="android for work, work, enterprise, corporate"
|
||||
page.tags="android for work, work, enterprise, corporate"
|
||||
page.metaDescription=Learn how to build Android apps for the enterprise and take advantage of Google's Android for Work program.
|
||||
page.image=images/work/cards/briefcase_600px.png
|
||||
|
||||
@jd:body
|
||||
|
||||
<div id="qv-wrapper">
|
||||
<div id="qv">
|
||||
<h2>In this document</h2>
|
||||
<ul>
|
||||
<li><a href="#developer-guide">Create Apps Using the Developer Guide</a></li>
|
||||
<li><a href="#community-overview">What Does the Android for Work DevHub Offer?</a></li>
|
||||
<li><a href="#develop-apps">Develop Apps for Enterprises</a></li>
|
||||
<li><a href="#manage-devices">Manage Devices and Apps</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
As an Android for Work developer, you can deploy devices and apps to
|
||||
employees and keep your corporate data secure. With Android for
|
||||
Work, organizations can choose what devices, APIs, and framework
|
||||
they want to use to develop apps.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
With Android for Work, you can:
|
||||
<ul>
|
||||
<li>Build apps to help employees be more productive in scenarios
|
||||
such as bring your own device (BYOD), and corporate-owned,
|
||||
single-use devices (COSU).</li>
|
||||
<li>Connect with leading enterprise mobility management (EMM)
|
||||
<a href="https://www.google.com/work/android/partners/"
|
||||
>partners</a> to help integrate Android in your business.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Additionally, Android for Work offers a partner program for
|
||||
developers through the
|
||||
<a href="https://connect.googleforwork.com/community/applicants/android/isv"
|
||||
>Android for Work DevHub</a>, which provides exclusive access to beta
|
||||
features and developer events, along with access to a community of
|
||||
Android developers making enterprise apps.
|
||||
</p>
|
||||
|
||||
<h2 id="developer-guide">Create Apps Using the Developer Guide</h2>
|
||||
|
||||
<p>
|
||||
The <a href="{@docRoot}work/guide.html"
|
||||
>Android for Work Developer Guide</a> is for developers who want to
|
||||
create Android apps that best utilize and complement the features in
|
||||
Android for Work. The guide defines the best practices to develop
|
||||
and test enterprise-focused apps for Android devices running Android
|
||||
for Work.
|
||||
</p>
|
||||
|
||||
<h3>If you’re new to creating Android apps ...</h3>
|
||||
|
||||
<p>
|
||||
The Developer Guide assumes that you’re working as an independent
|
||||
software vendor (ISV) or in a similar role, and have already built
|
||||
an Android app. If you haven’t yet created an Android app, see
|
||||
<a href="{@docRoot}training/basics/firstapp/index.html"
|
||||
>Building Your First App</a>. If you’re looking for an accelerated
|
||||
course, see the <a href="https://www.udacity.com/course/ud853"
|
||||
>Developing Android Apps</a> course taught by Google employees.
|
||||
</p>
|
||||
|
||||
<h2 id="community-overview">What Does the Android for Work DevHub Offer?</h2>
|
||||
|
||||
<p>
|
||||
The <a href="https://connect.googleforwork.com/community/applicants/android/isv"
|
||||
>Android for Work DevHub</a> offers these incentives:
|
||||
</p>
|
||||
|
||||
<h3>Get exclusives</h3>
|
||||
|
||||
<p>
|
||||
Access to beta features and Android for Work developer training and
|
||||
events, including invite-only hackathons.
|
||||
</p>
|
||||
|
||||
<h3>Learn from experts</h3>
|
||||
|
||||
<p>
|
||||
Special content from Android for Work experts, including how to
|
||||
optimize your app for the Play for Work store so that businesses can
|
||||
see your app.
|
||||
</p>
|
||||
|
||||
<h3>Talk to others</h3>
|
||||
|
||||
<p>
|
||||
Access to a moderated space dedicated to enterprise developers. Talk
|
||||
with peers about issues specific to developing Android apps for
|
||||
businesses.
|
||||
</p>
|
||||
|
||||
<h3>How do I join?</h3>
|
||||
|
||||
<p>
|
||||
Apply to join the
|
||||
<a href="https://connect.googleforwork.com/community/applicants/android/isv"
|
||||
>Android for Work DevHub</a>.
|
||||
</p>
|
||||
|
||||
<h2 id="develop-apps">Develop Apps for Enterprises</h2>
|
||||
|
||||
<p>
|
||||
Learn how to make your app function smoothly in corporate
|
||||
environments that restrict device features and data access. Go
|
||||
further to support business use of your app by enabling restrictions
|
||||
that administrators can use to remotely configure your app:
|
||||
</p>
|
||||
|
||||
<div class="dynamic-grid">
|
||||
<div class="resource-widget resource-flow-layout landing col-12"
|
||||
data-query="collection:work/apps"
|
||||
data-cardSizes="6x6"
|
||||
data-maxResults="6">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<h2 id="manage-devices">Manage Devices and Apps</h2>
|
||||
|
||||
<p>
|
||||
Learn how to build policy controller apps that enable enterprise
|
||||
administrators to manage devices, manage corporate apps, and provide
|
||||
access to company resources:
|
||||
</p>
|
||||
|
||||
<div class="dynamic-grid">
|
||||
<div class="resource-widget resource-flow-layout landing col-12"
|
||||
data-query="collection:work/admin"
|
||||
data-cardSizes="6x6"
|
||||
data-maxResults="4">
|
||||
</div>
|
||||
</div>
|
||||
44
docs/html/work/work_toc.cs
Normal file
@@ -0,0 +1,44 @@
|
||||
<ul id="nav">
|
||||
|
||||
<li class="nav-section">
|
||||
<div class="nav-section-header empty">
|
||||
<a href="<?cs var:toroot ?>work/index.html">
|
||||
Android for Work Home</a>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="nav-section">
|
||||
<div class="nav-section-header empty">
|
||||
<a href="<?cs var:toroot ?>work/overview.html">
|
||||
Overview</a>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="nav-section">
|
||||
<div class="nav-section-header empty">
|
||||
<a href="<?cs var:toroot ?>work/guide.html">
|
||||
Developer Guide</a>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="nav-section">
|
||||
<div class="nav-section-header empty">
|
||||
<a href="<?cs var:toroot ?>work/managed-profiles.html">
|
||||
Set up Managed Profiles</a></div>
|
||||
</li>
|
||||
|
||||
<li class="nav-section">
|
||||
<div class="nav-section-header empty">
|
||||
<a href="<?cs var:toroot ?>work/app-restrictions.html">
|
||||
Set up App Restrictions</a>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="nav-section">
|
||||
<div class="nav-section-header empty">
|
||||
<a href="<?cs var:toroot ?>work/cosu.html">
|
||||
Set up Single-Purpose Devices</a>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||