How can I generate a QR code image from an enrollment token in the Android Management API for fully managed device provisioning?

47 views Asked by At

I have successfully created an enrollment token using the Android Management API, and I now need to provision a device as fully managed by using the QR code provisioning method. To achieve this, I require a QR code image containing the necessary information from the enrollment token. The enrollment token object includes the qrCode field, which contains the data to be encoded into the QR code. I would like to know how to extract this data and generate a scannable QR code image in an Android application. Any guidance or code examples using QR code generation libraries would be greatly appreciated.


import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
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.EnrollmentToken;
import com.google.api.services.androidmanagement.v1.model.Enterprise;
import com.google.api.services.androidmanagement.v1.model.Policy;
import com.google.api.services.androidmanagement.v1.model.SignupUrl;
import com.google.gson.Gson;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class MainActivity extends AppCompatActivity {

    private static final String PROJECT_ID = "ssf-admin-399810";

    private static final String SERVICE_ACCOUNT_CREDENTIAL_FILE =
            "C:\\Users\\Sukriti_14\\Downloads\\serviceAccount.json";

    private static final String POLICY_ID = "samplePolicy";

    private static final String COSU_APP_PACKAGE_NAME =
            "com.google.android.apps.youtube.gaming";

    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";

    private AndroidManagement androidManagementClient = null;
    private AndroidManagement.Enterprises enterprises = null;
    private Enterprise enterprise = null;
    private static final String TAG = "MainActivity";
    Button createEnterprise, initializeClient, submitEnterpriseToken, patchPolicy, createEnrollmentToken;
    EditText enterpriseToken;
    private String signupUrlName = "";
    private String enterpriseId = "";
    private String enterpriseName = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        createEnterprise = findViewById(R.id.createEnterprise);
        initializeClient = findViewById(R.id.initializeClient);
        submitEnterpriseToken = findViewById(R.id.submitEnterpriseToken);
        enterpriseToken = findViewById(R.id.enterpriseToken);
        patchPolicy = findViewById(R.id.patchPolicy);
        createEnrollmentToken = findViewById(R.id.createEnrollmentToken);

        initializeClient.setOnClickListener(view -> {
            try {
                androidManagementClient = getAndroidManagementClient(getApplicationContext());
                Log.i(TAG, "onCreate: Management client created");
            } catch (IOException | GeneralSecurityException e) {
                Log.e(TAG, "onCreate: " + e.getMessage());
            }
        });

        createEnterprise.setOnClickListener(view -> {
            createEnterprise();
        });

        submitEnterpriseToken.setOnClickListener(view -> {
            completeEnterpriseCreationProcess(enterpriseToken.getText().toString());
        });

        patchPolicy.setOnClickListener(view -> {
            Log.i(TAG, "onCreate: Patching Policy");
            setPolicy(enterpriseName, POLICY_ID, getPolicy());
        });

        createEnrollmentToken.setOnClickListener(view -> {
            String tokenEnrollment = createEnrollmentToken(enterpriseName, POLICY_ID);
            Log.i(TAG, "onCreate: Enrollment token " + tokenEnrollment);
        });

    }


    private static AndroidManagement getAndroidManagementClient(Context context)
            throws IOException, GeneralSecurityException {
        AndroidManagement temp = null;
        Log.i(TAG, "getAndroidManagementClient: Creating android management client object");
        try {
            InputStream input = context.getAssets().open("serviceAccount.json");
            GoogleCredential credential =
                    GoogleCredential.fromStream(input)
                            .createScoped(Collections.singleton(OAUTH_SCOPE));
            temp = new AndroidManagement.Builder(
                    GoogleNetHttpTransport.newTrustedTransport(),
                    GsonFactory.getDefaultInstance(),
                    credential)
                    .setApplicationName(APP_NAME)
                    .build();
        } catch (IOException e) {
            Log.e(TAG, "getAndroidManagementClient: " + e.getMessage());
        }

        return temp;
    }

    private void createEnterprise() {
        new Thread(() -> {
            try {
                Log.i(TAG, "createEnterprise: Creating Enterprise");
                if (androidManagementClient != null) {
                    SignupUrl signupUrl = androidManagementClient
                            .signupUrls()
                            .create()
                            .setProjectId(PROJECT_ID)
                            .setCallbackUrl("https://localhost:9999")
                            .execute();

                    signupUrlName = signupUrl.getName();
                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(signupUrl.getUrl()));
                    startActivity(intent);
                    Log.i(TAG, "createEnterprise: Enterprise Created -> " + signupUrl.getUrl());
                } else {
                    Log.e(TAG, "createEnterprise: Null Object");
                }
            } catch (IOException e) {
                Log.e(TAG, "createEnterprise: " + e.getMessage());
            }
        }).start();
    }

    private void completeEnterpriseCreationProcess(String token) {
        Log.i(TAG, "completeEnterpriseCreationProcess: ");
        new Thread(() -> {
            try {
                Log.i(TAG, "completeEnterpriseCreationProcess run: ");
                enterprise = androidManagementClient.enterprises().create(
                                new Enterprise())
                        .setAgreementAccepted(true)
                        .setProjectId(PROJECT_ID)
                        .setSignupUrlName(signupUrlName)
                        .setEnterpriseToken(token)
                        .execute();

                Log.i(TAG, "completeEnterpriseCreationProcess: enterprise creation process completed ");
                Log.i(TAG, "completeEnterpriseCreationProcess: Enterprise Name " + enterprise.getName());
                enterpriseId = enterprise.getName().split("/")[1];
                Log.i(TAG, "completeEnterpriseCreationProcess: Enterprise ID " + enterpriseId);
                enterprises = androidManagementClient.enterprises();
                enterpriseName = enterprise.getName();
            } catch (IOException e) {
                Log.e(TAG, "completeEnterpriseCreationProcess run: " + e.getMessage());
            }
        }).start();
    }

    private Policy getPolicy() {
        return new Policy()
                .setApplications(
                        Collections.singletonList(
                                new ApplicationPolicy()
                                        .setPackageName("com.google.samples.apps.iosched")
                                        .setInstallType("KIOSK")
                                        .setDefaultPermissionPolicy("GRANT")
                        )
                );
    }

    private void setPolicy(String enterpriseName, String policyId, Policy policy) {
        new Thread(() -> {
            try {
                String name = enterpriseName + "/policies/" + policyId;
                androidManagementClient
                        .enterprises()
                        .policies()
                        .patch(name, policy)
                        .execute();

                Log.i(TAG, "setPolicy: Policy Patched successfully");
            } catch (IOException e) {
                Log.e(TAG, "setPolicy: " + e.getMessage());
            }
        }).start();

    }

    private String createEnrollmentToken(String nameEnterprise, String policyId) {
        final String[] tokenString = new String[1];
        new Thread(() -> {
            Log.i(TAG, "createEnrollmentToken: Creating enrollment token");
            EnrollmentToken token = new EnrollmentToken().setPolicyName(policyId).setDuration("86400s");
            try {
               EnrollmentToken enrollmentToken  =  androidManagementClient
                        .enterprises()
                        .enrollmentTokens()
                        .create(enterpriseName, token)
                        .execute();
                tokenString[0] = enrollmentToken.getValue();
                Log.i(TAG, "createEnrollmentToken: Enrollment Token " + new Gson().toJson(enrollmentToken));
                Log.i(TAG, "createEnrollmentToken: Enrollment Token qrcode " + enrollmentToken.getQrCode());

            } catch (IOException e) {
                Log.e(TAG, "createEnrollmentToken: " + e.getMessage());
            }
        }).start();

        return tokenString[0];
    }
}```


This is the code that I am using. I am just trying to create a sample app so please don't mind the approach I used here.
0

There are 0 answers