This page presents a sample app that demonstrates how to provision a dedicated device, and send it a reboot command. The app uses the Android Management API Java client library.
Before you begin
- Download the Android Management API Java client library and add all the jar files to the classpath.
- Create or select a Google Cloud project that will own the created enterprise.
- Enable the Android Management API in the project.
- Create or select a service account that has the owner or editor role on the project.
- Select a Google Account to sign up for a new enterprise. The account cannot be the admin for any pre-existing enterprise.
- Set the
PROJECT_ID
andSERVICE_ACCOUNT_CREDENTIAL_FILE
constants in the code sample. - Change the
APP_PACKAGE_NAME
constant in the code sample to install the app of your choice.
Code
package sample;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.androidmanagement.v1.AndroidManagement;
import com.google.api.services.androidmanagement.v1.model.ApplicationPolicy;
import com.google.api.services.androidmanagement.v1.model.Command;
import com.google.api.services.androidmanagement.v1.model.Device;
import com.google.api.services.androidmanagement.v1.model.EnrollmentToken;
import com.google.api.services.androidmanagement.v1.model.Enterprise;
import com.google.api.services.androidmanagement.v1.model.ListDevicesResponse;
import com.google.api.services.androidmanagement.v1.model.PersistentPreferredActivity;
import com.google.api.services.androidmanagement.v1.model.Policy;
import com.google.api.services.androidmanagement.v1.model.SignupUrl;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class SampleApp {
/** The id of the Google Cloud Platform project. */
private static final String PROJECT_ID = "YOUR_PROJECT_ID";
/** The JSON credential file for the service account. */
private static final String SERVICE_ACCOUNT_CREDENTIAL_FILE =
"/PATH/TO/YOUR_FILE";
/** The id of the policy for the dedicated device. */
private static final String POLICY_ID = "samplePolicy";
/** The package name of the app. */
private static final String APP_PACKAGE_NAME =
"com.google.android.apps.youtube.gaming";
/** The OAuth scope for the Android Management API. */
private static final String OAUTH_SCOPE =
"https://www.googleapis.com/auth/androidmanagement";
/** The name of this app. */
private static final String APP_NAME = "Android Management API sample app";
/** The Android Management API client. */
private final AndroidManagement androidManagementClient;
public static void main(String[] args)
throws IOException, GeneralSecurityException {
new SampleApp(getAndroidManagementClient()).run();
}
public SampleApp(AndroidManagement androidManagementClient) {
this.androidManagementClient = androidManagementClient;
}
/** Runs the app. */
public void run() throws IOException {
// Create an enterprise. If you've already created an enterprise, the
// createEnterprise call can be commented out and replaced with your
// enterprise name.
String enterpriseName = createEnterprise();
System.out.println("Enterprise created with name: " + enterpriseName);
// Set the policy to be used by the device.
setPolicy(enterpriseName, POLICY_ID, getDedicatedDevicePolicy());
// Create an enrollment token to enroll the device.
String token = createEnrollmentToken(enterpriseName, POLICY_ID);
System.out.println("Enrollment token (to be typed on device): " + token);
// List some of the devices for the enterprise. There will be no devices for
// a newly created enterprise, but you can run the app again with an
// existing enterprise after enrolling a device.
List<Device> devices = listDevices(enterpriseName);
for (Device device : devices) {
System.out.println("Found device with name: " + device.getName());
}
// If there are any devices, reboot one.
if (devices.isEmpty()) {
System.out.println("No devices found.");
} else {
rebootDevice(devices.get(0));
}
}
/** Builds an Android Management API client. */
private static AndroidManagement getAndroidManagementClient()
throws IOException, GeneralSecurityException {
try (FileInputStream input = new FileInputStream(SERVICE_ACCOUNT_CREDENTIAL_FILE)) {
final GoogleCredentials credential =
GoogleCredentials.fromStream(input).createScoped(Collections.singleton(OAUTH_SCOPE));
final HttpCredentialsAdapter credentialsAdapter = new HttpCredentialsAdapter(credential);
final HttpRequestFactory requestFactory =
new NetHttpTransport().createRequestFactory(credentialsAdapter);
return new AndroidManagement.Builder(
GoogleNetHttpTransport.newTrustedTransport(),
GsonFactory.getDefaultInstance(),
requestFactory.getInitializer())
.setApplicationName(APP_NAME)
.build();
}
}
/** Creates a new enterprise. Returns the enterprise name. */
private String createEnterprise() throws IOException {
// Initiate signup process.
System.out.println("Creating signup URL...");
SignupUrl signupUrl =
androidManagementClient
.signupUrls()
.create()
.setProjectId(PROJECT_ID)
.setCallbackUrl("https://localhost:9999")
.execute();
System.out.print(
"To sign up for a new enterprise, open this URL in your browser: ");
System.out.println(signupUrl.getUrl());
System.out.println(
"After signup, you will see an error page in the browser.");
System.out.print(
"Paste the enterpriseToken value from the error page URL here: ");
String enterpriseToken =
new BufferedReader(new InputStreamReader(System.in)).readLine();
// Create the enterprise.
System.out.println("Creating enterprise...");
return androidManagementClient
.enterprises()
.create(new Enterprise())
.setProjectId(PROJECT_ID)
.setSignupUrlName(signupUrl.getName())
.setEnterpriseToken(enterpriseToken)
.execute()
.getName();
}
/** Gets a Policy for a dedicated device. */
private Policy getDedicatedDevicePolicy() {
List<String> categories = Arrays.asList(
"android.intent.category.HOME",
"android.intent.category.DEFAULT"
);
return new Policy()
.setApplications(
Collections.singletonList(
new ApplicationPolicy()
.setPackageName(APP_PACKAGE_NAME)
.setInstallType("FORCE_INSTALLED")
.setDefaultPermissionPolicy("GRANT")
.setLockTaskAllowed(true)))
.setPersistentPreferredActivities(
Collections.singletonList(
new PersistentPreferredActivity()
.setReceiverActivity(APP_PACKAGE_NAME)
.setActions(
Collections.singletonList("android.intent.action.MAIN"))
.setCategories(categories)))
.setKeyguardDisabled(true)
.setStatusBarDisabled(true);
}
/** Sets the policy of the given id to the given value. */
private void setPolicy(String enterpriseName, String policyId, Policy policy)
throws IOException {
System.out.println("Setting policy...");
String name = enterpriseName + "/policies/" + policyId;
androidManagementClient
.enterprises()
.policies()
.patch(name, policy)
.execute();
}
/** Creates an enrollment token. */
private String createEnrollmentToken(String enterpriseName, String policyId)
throws IOException {
System.out.println("Creating enrollment token...");
EnrollmentToken token =
new EnrollmentToken().setPolicyName(policyId).setDuration("86400s");
return androidManagementClient
.enterprises()
.enrollmentTokens()
.create(enterpriseName, token)
.execute()
.getValue();
}
/** Lists the first page of devices for an enterprise. */
private List<Device> listDevices(String enterpriseName) throws IOException {
System.out.println("Listing devices...");
ListDevicesResponse response =
androidManagementClient
.enterprises()
.devices()
.list(enterpriseName)
.execute();
return response.getDevices() == null
? Collections.emptyList() : response.getDevices();
}
/** Reboots a device. Note that reboot only works on Android N+. */
private void rebootDevice(Device device) throws IOException {
System.out.println(
"Sending reboot command to " + device.getName() + "...");
Command command = new Command().setType("REBOOT");
androidManagementClient
.enterprises()
.devices()
.issueCommand(device.getName(), command)
.execute();
}
}