Come funziona

L'API per i clienti offre il controllo programmatico dei dispositivi e della configurazione per la registrazione zero-touch di Android. Questo documento introduce API per i provider di gestione della mobilità aziendale (EMM) e IT aziendale sviluppatori. Dopo aver letto questo documento, dovresti comprendere le risorse di base utilizzate nell'API e come interagiscono. Se non hai mai utilizzato la registrazione zero-touch, consulta la breve introduzione di android.com.

Panoramica

L'API cliente aiuta le organizzazioni che acquistano dispositivi Android con registrazione zero-touch. L'app o lo strumento può aiutare gli amministratori IT a:

  • Creare, modificare ed eliminare le configurazioni di provisioning.
  • Applicare o rimuovere una configurazione su un dispositivo.
  • Seleziona una configurazione predefinita per i dispositivi aggiunti alla registrazione zero-touch in futuro.

Tramite l'API, gli amministratori IT possono anche annullare la registrazione dei dispositivi dalla registrazione zero-touch della registrazione. Per gestire gli utenti della sua organizzazione o accettare i Termini di servizio, Gli amministratori IT utilizzano il portale per la registrazione zero-touch.

Gli utenti tipici di questa API potrebbero essere:

  • I provider EMM aggiungono il supporto per la registrazione zero-touch alla loro console.
  • Sviluppatori IT aziendali che creano strumenti per automatizzare le attività di registrazione zero-touch.

Risorse principali

Le configurazioni e i dispositivi sono le risorse principali che utilizzi nell'API. Un un'organizzazione può anche creare configurazioni e dispositivi usando la funzionalità portale di registrazione.

Rapporto tra dispositivo e risorse del cliente

Configurazione
Gli amministratori IT impostano le opzioni di provisioning per i dispositivi utilizzando una configurazione. Le configurazioni includono criteri EMM per dispositivi mobili e dati di contatto mostrati a e aiutare gli utenti. Le configurazioni sono fondamentali per l'API, quindi puoi usarle in molte di machine learning. Per saperne di più, vedi Configurazioni di seguito.
Dispositivo
Un dispositivo Android con funzionalità di registrazione zero-touch da cui è stata acquistata un'organizzazione rivenditore. Applica una configurazione per includere il dispositivo nella registrazione zero-touch della registrazione. I dispositivi hanno ID hardware e metadati collegati. Per saperne di più, vedi Dispositivi qui sotto.
DPC (controller criteri dispositivi)
Un riferimento di sola lettura al DPC (criteri relativi ai dispositivi) di un EMM controller). Aggiungi un DPC (controller criteri dispositivi) a una configurazione per selezionare la soluzione EMM per i dispositivi. Tutti i DPC elencati dall'API supportano la registrazione zero-touch e sono disponibili in Google Play. A per saperne di più, consulta Dpc.

Per elencare tutti i metodi e le risorse dell'API che l'app può utilizzare, consulta le Riferimento API.

Configurazioni

La risorsa API Configuration combina seguenti:

  • Il DPC dell'EMM installato sui dispositivi.
  • Criteri EMM applicati ai dispositivi.
  • Dati di contatto visualizzati sul dispositivo per aiutare gli utenti durante la configurazione.

Utilizzando l'API, la tua app può gestire le configurazioni per gli amministratori IT. Chiama l'API per recuperare, creare, aggiornare ed eliminare le configurazioni. L'esempio di seguito mostra come crea una nuova configurazione:

Java

// Add metadata to help the device user during provisioning.
Configuration configuration = new Configuration();
configuration.setConfigurationName("Sales team");
configuration.setCompanyName("XYZ Corp.");
configuration.setContactEmail("it-support@example.com");
configuration.setContactPhone("+1 (800) 555-0112");
configuration.setCustomMessage("We're setting up your phone. Call or email for help.");

// Set the DPC that zero-touch enrollment downloads and installs from Google Play.
configuration.setDpcResourcePath(dpc.getName());

// Set the JSON-formatted EMM provisioning extras that are passed to the DPC.
configuration.setDpcExtras("{"
      + "\"android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED\":true,"
      + "\"android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE\":{"
      + "\"default_min_password_length\":6,"
      + "\"company_name\":\"XYZ Corp\","
      + "\"management_server\":\"emm.example.com\","
      + "\"terms_url\":\"https://www.example.com/policies/terms/\","
      + "\"allowed_user_domains\":\"[\\\"example.com\\\", \\\"example.org\\\"]\""
      + "}"
      + "}");

// Create the new configuration on the server.
AndroidProvisioningPartner.Customers.Configurations.Create request =
      service.customers().configurations().create(customerAccount, configuration);
Configuration response = request.execute();

.NET

// Add metadata to help the device user during provisioning.
Configuration configuration = new Configuration
{
    ConfigurationName = "Sales team",
    CompanyName = "XYZ Corp.",
    ContactEmail = "it-support@example.com",
    ContactPhone = "+1 (800) 555-0112",
    CustomMessage = "We're setting up your phone. Call or email for help."
};

// Set the DPC that zero-touch enrollment downloads and installs from Google Play.
configuration.DpcResourcePath = dpc.Name;

// Set the JSON-formatted EMM provisioning extras that are passed to the DPC.
configuration.DpcExtras = @"{
    ""android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED"":true,
    ""android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE"":{
    ""default_min_password_length"":6,
    ""company_name"":""XYZ Corp"",
    ""management_server"":""emm.example.com"",
    ""terms_url"":""https://www.example.com/policies/terms/"",
    ""allowed_user_domains"":""[\""example.com\"", \""example.org\""]""
  }
}";

// Create the new configuration on the server.
var request = service.Customers.Configurations.Create(configuration, customerAccount);
var response = request.Execute();

Python

# Add metadata to help the device user during provisioning.
configuration = {
    'configurationName': 'Sales team',
    'companyName': 'XYZ Corp.',
    'contactEmail': 'it-support@example.com',
    'contactPhone': '+1 (800) 555-0112',
    'customMessage': 'We\'re setting up your phone. Call or email for help.'}

# Set the DPC that zero-touch enrollment installs from Google Play.
configuration['dpcResourcePath'] = dpc['name']

# Set the JSON-formatted EMM provisioning extras that are passed to the DPC.
configuration['dpcExtras'] = '''{
    "android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED":true,
    "android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE":{
      "default_min_password_length":6,
      "company_name":"XYZ Corp",
      "management_server":"emm.example.com",
      "terms_url":"https://www.example.com/policies/terms/",
      "allowed_user_domains":"[\\"example.com\\", \\"example.org\\"]"}
}'''

# Create the new configuration on the server.
response = service.customers().configurations().create(
    parent=customer_account, body=configuration).execute()

Quando aggiorni una configurazione utilizzando l'API patch, ricordati di includere il parametro maschera di campo: per ogni campo che non vuoi che sia null. Consulta Configurazioni predefinite (di seguito) per un esempio che mostra come aggiornare efficacemente una configurazione.

Elimina configurazioni

Non puoi eliminare una configurazione se è ancora applicata ai dispositivi. Se provi a elimini una configurazione in uso, il metodo API restituisce un URL HTTP 400 Bad Request codice di stato e un messaggio che spiega quanti dispositivi utilizzano la configurazione. Chiamare customers.devices.removeConfiguration per rimuovere la configurazione dai dispositivi prima di riprovare.

Configurazioni predefinite

La registrazione zero-touch funziona al meglio quando un'organizzazione imposta un valore predefinito configurazione applicata a tutti i nuovi dispositivi acquistati dall'organizzazione. Valuta la possibilità di chiedere agli amministratori IT di impostare una configurazione predefinita se non ne esiste una. L'esempio seguente mostra come rendere predefinita una configurazione esistente impostazione di isDefault su true:

Java

// Send minimal data with the request. Just the 2 required fields.
// targetConfiguration is an existing configuration that we want to make the default.
Configuration configuration = new Configuration();
configuration.setIsDefault(true);
configuration.setConfigurationId(targetConfiguration.getConfigurationId());

// Call the API, including the FieldMask to avoid setting other fields to null.
AndroidProvisioningPartner.Customers.Configurations.Patch request = service
      .customers()
      .configurations()
      .patch(targetConfiguration.getName(), configuration);
request.setUpdateMask("isDefault");
Configuration results = request.execute();

.NET

// Send minimal data with the request. Just the 2 required fields.
// targetConfiguration is an existing configuration that we want to make the default.
Configuration configuration = new Configuration
{
    IsDefault = true,
    ConfigurationId = targetConfiguration.ConfigurationId,
};

// Call the API, including the FieldMask to avoid setting other fields to null.
var request = service.Customers.Configurations.Patch(configuration,
                                                     targetConfiguration.Name);
request.UpdateMask = "IsDefault";
Configuration results = request.Execute();

Python

# Send minimal data with the request. Just the 2 required fields.
# target_configuration is an existing configuration we'll make the default.
configuration = {
    'isDefault': True,
    'configurationId': target_configuration['configurationId']}

# Call the API, including the FieldMask to avoid setting other fields to null.
response = service.customers().configurations().patch(
    name=target_configuration['name'],
    body=configuration, updateMask='isDefault').execute()

Può esistere una sola configurazione predefinita. Creiamo una nuova configurazione predefinita, Il campo isDefault di una configurazione precedente viene impostato su false. Potresti dover aggiorna tutte le istanze Configuration memorizzate nella cache per visualizzare i valori corretti nella isDefault campi.

Guida gli utenti dei dispositivi

La configurazione zero-touch mostra indicazioni personalizzate per gli utenti nella configurazione guidata del dispositivo per aiutarli. Devi includere un numero di telefono e un indirizzo email di contatto indirizzo insieme al nome dell'organizzazione che gestisce il dispositivo in un configurazione. Ti consigliamo inoltre di includere una o due frasi nella customMessage per fornire ulteriori dettagli su cosa sta succedendo a un utente dispositivo.

Perché l'utente non potrà effettuare chiamate o inviare email dal dispositivo che ha impostato formatta il numero di telefono e l'indirizzo email in modo che sia più facile le informazioni.

Dispositivi

I rivenditori creano i dispositivi quando un cliente li acquista per la registrazione zero-touch Registrazione: gli amministratori IT non possono creare dispositivi. Per usare i dispositivi, attiva i metodi di chiamata la risorsa API Device. Se hai bisogno di cercare per i dispositivi, elenca tutti i dispositivi e filtra ogni batch localmente nella tua app. Per un esempio, consulta la sezione Risultati impaginati di seguito.

Configura dispositivi

L'applicazione di una configurazione a un dispositivo registra la registrazione zero-touch del dispositivo della registrazione. Per applicare una configurazione, richiama customers.devices.applyConfiguration Dopo aver applicato una configurazione, il dispositivo esegue automaticamente il provisioning al primo avvio o al successivo ripristino dei dati di fabbrica. L'esempio di seguito mostra come applicare configurazione a una raccolta di dispositivi:

Java

List<Device> devices = getDevicesToConfigure(service);
Configuration configurationToApply = getConfigurationToApply(service);

// Loop through the collection and apply the configuration to each device. This might
// take some time if the collection contains many devices.
for (Device device : devices) {
    System.out.println(device.getDeviceIdentifier().getImei());

    // Wrap the device ID in a DeviceReference.
    DeviceReference deviceRef = new DeviceReference();
    deviceRef.setDeviceId(device.getDeviceId());

    // Build and send the request to the API.
    CustomerApplyConfigurationRequest body = new CustomerApplyConfigurationRequest();
    body.setConfiguration(configurationToApply.getName());
    body.setDevice(deviceRef);

    AndroidProvisioningPartner.Customers.Devices.ApplyConfiguration request = service
          .customers()
          .devices()
          .applyConfiguration(customerAccount, body);
    request.execute();
}

.NET

IList<Device> devices = GetDevicesToConfigure(service);
Configuration configurationToApply = GetConfigurationToApply(service);

// Loop through the collection and apply the configuration to each device. This might
// take some time if the collection contains many devices.
foreach (Device device in devices)
{
    Console.WriteLine(device.DeviceIdentifier.Imei);

    // Wrap the device ID in a DeviceReference.
    var deviceRef = new DeviceReference
    {
        DeviceId = device.DeviceId
    };

    // Build and send the request to the API.
    CustomerApplyConfigurationRequest body = new CustomerApplyConfigurationRequest
    {
        Configuration = configurationToApply.Name,
        Device = deviceRef
    };
    var request = service.Customers.Devices.ApplyConfiguration(body,
                                                               customerAccount);
    request.Execute();
}

Python

devices = get_devices_to_configure(service)
configuration = get_configuration_to_apply(service)

# Loop through the collection and apply the configuration to each device.
# This might take some time if the collection contains many devices.
for device in devices:
  print(device['deviceIdentifier']['imei'])

  # Wrap the device ID in a DeviceReference.
  device_ref = {'deviceId': device['deviceId']}

  # Build and send the request to the API.
  body = {'configuration': configuration['name'], 'device': device_ref}
  service.customers().devices().applyConfiguration(
      parent=customer_account, body=body).execute()

Per rimuovere la configurazione da un dispositivo, chiama customers.devices.removeConfiguration La modifica viene applicata dopo il ripristino dei dati di fabbrica del dispositivo.

Annulla rivendicazione dispositivi

Gli amministratori IT possono annullare la rivendicazione di un dispositivo per rimuoverlo dalla registrazione zero-touch. Un servizio IT un amministratore potrebbe annullare la rivendicazione di un dispositivo di cui vuole eseguire la migrazione a un altro account, o restituirlo al rivenditore. Chiama il metodo customers.devices.unclaim per annullare la rivendicazione di un dispositivo di un'organizzazione.

L'esempio seguente mostra come annullare la rivendicazione di un dispositivo da un numero IMEI e nome del produttore:

Java

// Wrap the hardware ID and manufacturer values in a DeviceIdentifier.
// Then wrap the DeviceIdentifier in a DeviceReference.
DeviceIdentifier identifier = new DeviceIdentifier();
identifier.setImei("123456789012347");
identifier.setManufacturer("Google");
DeviceReference reference = new DeviceReference();
reference.setDeviceIdentifier(identifier);

// Create the body of the request.
CustomerUnclaimDeviceRequest body = new CustomerUnclaimDeviceRequest();
body.setDevice(reference);

// Call the API method to unclaim the device from the organization.
service.customers().devices().unclaim(customerAccount, body).execute();

.NET

// Wrap the hardware ID and manufacturer values in a DeviceIdentifier.
// Then wrap the DeviceIdentifier in a DeviceReference.
DeviceIdentifier identifier = new DeviceIdentifier
{
    Imei = "123456789012347",
    Manufacturer = "Google"
};
DeviceReference reference = new DeviceReference();
reference.DeviceIdentifier = identifier;

// Create the body of the request.
CustomerUnclaimDeviceRequest body = new CustomerUnclaimDeviceRequest();
body.Device = reference;

// Call the API method to unclaim the device from the organization.
service.Customers.Devices.Unclaim(body, customerAccount).Execute();

Python

# Wrap the hardware ID and manufacturer values in a DeviceIdentifier.
# Then wrap the DeviceIdentifier in a DeviceReference.
identifier = {'imei': '123456789012347', 'manufacturer': 'Google'}
reference = {'deviceIdentifier': identifier}

# Create the body of the request.
body = {'device': reference}

# Call the API method to unclaim the device from the organization.
service.customers().devices().unclaim(
    parent=customer_account, body=body).execute()

Metadati del dispositivo

Un amministratore IT può vedere i metadati associati al dispositivo dal rivenditore. Rete Display Questi metadati del dispositivo nella tua app per aiutare gli amministratori IT a riconoscere i dispositivi.

Per ulteriori informazioni sui metadati che potrebbero essere visualizzati, leggi l'articolo sul sui metadati per i rivenditori.

Risultati per pagine

Il metodo API customers.devices.list potrebbe restituire elenchi di dispositivi molto lunghi. Per ridurre le dimensioni della risposta, questa e altre API (come customers.list) supportano i risultati impaginati. Con i risultati paginati, l'applicazione può richiedere ed elaborare in modo iterativo elenchi di grandi dimensioni, una pagina alla volta.

Dopo aver chiamato il metodo API, controlla se la risposta include un valore per nextPageToken Se nextPageToken non è null, la tua app può utilizzarla per recuperare un'altra pagina di dispositivi chiamando il metodo . Devi impostare un limite superiore per il numero di dispositivi nella Parametro pageSize. Se nextPageToken è null, la tua app ha richiesto il l'ultima pagina.

Il metodo di esempio riportato di seguito mostra in che modo la tua app potrebbe stampare un elenco di dispositivi, uno: pagina alla volta:

Java

private void printDevices(AndroidProvisioningPartner service, String customerAccount,
      String pageToken) throws IOException {

    // Call the API to get a page of Devices. Send a page token from the method argument.
    // If the page token is null, the API returns the first page.
    AndroidProvisioningPartner.Customers.Devices.List request =
          service.customers().devices().list(customerAccount);
    request.setPageSize(50L);
    request.setPageToken(pageToken);
    CustomerListDevicesResponse response = request.execute();

    // Print the devices included in this page of results.
    for (Device device : response.getDevices()) {
        System.out.format("Device: %s\n", device.getName());
    }
    System.out.println("---");

    // Check to see if another page of devices is available. If yes, fetch & print the devices.
    if (response.getNextPageToken() != null) {
        this.printDevices(service, customerAccount, response.getNextPageToken());
    }
}

.NET

private void PrintDevices(AndroidProvisioningPartnerService service, String customerAccount,
                          String pageToken)
{
    // Call the API to get a page of Devices. Send a page token from the method argument.
    // If the page token is null, the API returns the first page.
    var request = service.Customers.Devices.List(customerAccount);
    request.PageSize = 50;
    request.PageToken = pageToken;
    var response = request.Execute();

    // Print the devices included in this page of results.
    foreach (Device device in response.Devices)
    {
        Console.WriteLine("Device: {0}", device.Name);
    }
    Console.WriteLine("---");

    // Check to see if another page of devices is available. If yes, fetch and print the devices.
    if (response.NextPageToken != null)
    {
        this.PrintDevices(service, customerAccount, response.NextPageToken);
    }
}

Python

def print_devices(service, customer_account, page_token):
  """Demonstrates how to loop through paginated lists of devices."""

  # Call the API to get a page of Devices. Send a page token from the method
  # argument. If the page token is None, the API returns the first page.
  response = service.customers().devices().list(
      parent=customer_account, pageSize=50, pageToken=page_token).execute()

  # Print the devices included in this page of results.
  for device in response['devices']:
    print('Device: {0}'.format(device['name']))
  print('---')

  # Check to see if another page of devices is available. If yes,
  # fetch and print the devices.
  if 'nextPageToken' in response:
    print_devices(service, customer_account, response['nextPageToken'])

Inizia

Successivamente, scopri come autorizzare le chiamate API in Autorizzazione. Se vuoi esplora le API, dai un'occhiata alle guide rapide Java .NET e Python. Puoi utilizzare uno dei seguenti colab per visualizzare esempi di chiamate API e esperimenti con le chiamate all'API autonomamente.