本頁提供的範例應用程式示範如何佈建專屬的 裝置,並傳送重新啟動指令給裝置。應用程式使用 Android Management API Java 用戶端程式庫。
事前準備
- 下載 Android Management API Java 用戶端程式庫並 將所有 jar 檔案加入類別路徑中。
- 建立或選取一項要擁有專案的 Google Cloud 專案 創立企業
- 在專案中啟用 Android Management API。
- 建立或選取具備擁有者或編輯者角色的服務帳戶 專案。
- 如要申請新企業,請選取 Google 帳戶。該帳戶無法 成為任何現有企業的管理員。
- 設定
PROJECT_ID
和SERVICE_ACCOUNT_CREDENTIAL_FILE
常數 程式碼範例 - 變更程式碼範例中的
APP_PACKAGE_NAME
常數來安裝應用程式 自訂策略
程式碼
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();
}
}