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.