设备所有者二维码停止在 Android12 设备上工作,收到无法设置设备消息



由于某些原因,用于安装我们的应用程序作为设备所有者的QR码在Android12设备上停止工作(相同的QR码在以前的Android版本上完全有效)。

我们得到的错误信息是:

Can't set up device
Contact your IT admin for help

这是二维码的JSON

{
"android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION": "https://someurlthatworkforsure",
"android.app.extra.PROVISIONING_SKIP_ENCRYPTION": true,
"android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM": "validCheckSumThatWasTestedAndDoesWorkOnAndroidPriodTo12",
"android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME": "com.brand.name/com.brand.some.SomeClass"
}

我已经做了一些谷歌搜索,但没有发现我们的QR码有什么问题,

我也尝试将PROVISIONING_SKIP_ENCRYPTION设置为false并删除它,结果是相同的。

CHECKSUM是有效的,如果我弄乱了它会抛出一个不同的错误…

提前感谢。

我最终用下面的方法解决了这个问题

您必须再添加两个活动来处理新流在这两个活动中,您都必须设置结果并完成活动

setResult(RESULT_OK, intent);
finish();

请注意,我注意到新方法在Android 12上100%有效(v31)但有时在Android 11v30上失败,所以我使这个解决方案是有条件的,它是在Android 12+上启用的,通过检查以下布尔值provision_mode_compliance_enabled,它存储在XML资源文件

ProvisioningModeActivity.java

package com.my.pkg;
import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.PersistableBundle;
import androidx.appcompat.app.AppCompatActivity;
import com.my.pkg.R;
import java.util.List;
public class ProvisioningModeActivity extends AppCompatActivity {
private String EXTRA_PROVISIONING_ALLOWED_PROVISIONING_MODES = "android.app.extra.PROVISIONING_ALLOWED_PROVISIONING_MODES";
private int PROVISIONING_MODE_FULLY_MANAGED_DEVICE = 1;
private int PROVISIONING_MODE_MANAGED_PROFILE = 2;
private String EXTRA_PROVISIONING_MODE = "android.app.extra.PROVISIONING_MODE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_get_provisioning_mode);
Intent intent = getIntent();
int provisioningMode = PROVISIONING_MODE_FULLY_MANAGED_DEVICE;
List<Integer> allowedProvisioningModes = intent.getIntegerArrayListExtra(EXTRA_PROVISIONING_ALLOWED_PROVISIONING_MODES);
if (allowedProvisioningModes != null) {
if (allowedProvisioningModes.contains(PROVISIONING_MODE_FULLY_MANAGED_DEVICE)) {
provisioningMode = PROVISIONING_MODE_FULLY_MANAGED_DEVICE;
} else if (allowedProvisioningModes.contains(PROVISIONING_MODE_MANAGED_PROFILE)) {
provisioningMode = PROVISIONING_MODE_MANAGED_PROFILE;
}
}
//grab the extras (might contain some needed values from QR code) and pass to AdminPolicyComplianceActivity
PersistableBundle extras = intent.getParcelableExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE);
Intent resultIntent = getIntent();
if (extras != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
resultIntent.putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, extras);
}
}
resultIntent.putExtra(EXTRA_PROVISIONING_MODE, provisioningMode);
setResult(RESULT_OK, resultIntent);
finish();
}
}

AdminPolicyComplianceActivity.java

package com.my.pkg;

import android.content.Intent;
import android.os.Bundle;
import com.my.pkg.R;
import androidx.appcompat.app.AppCompatActivity;

public class AdminPolicyComplianceActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_policy_compliance);
Intent intent = getIntent();
setResult(RESULT_OK, intent);
finish();
}
}

清单条目:请注意,这些活动是有条件地启用的(继续阅读直到答案结束)

<activity
android:name="com.communitake.android.lib.deviceadmin.AdminPolicyComplianceActivity"
android:exported="true"
android:enabled="@bool/provision_mode_compliance_enabled"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<intent-filter>
<action android:name="android.app.action.ADMIN_POLICY_COMPLIANCE"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="com.communitake.android.lib.deviceadmin.ProvisioningModeActivity"
android:screenOrientation="portrait"
android:exported="true"
android:enabled="@bool/provision_mode_compliance_enabled"
android:theme="@style/Theme.AppCompat"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<intent-filter>
<action android:name="android.app.action.GET_PROVISIONING_MODE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

activity_get_provisioning_mode.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".GetProvisioningModeActivity">
<Button
android:id="@+id/get_provisioning_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Get Provisioning Data"/>
</LinearLayout>

activity_policy_compliance.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".PolicyComplianceActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Policy Compliance Screen"/>
</LinearLayout>

最后一件事是将bools.xml添加到valuesvalues-v31文件夹,具有以下内容,请注意,新的流程最好在Android 12和更高版本上启用

值文件夹

<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="provision_mode_compliance_enabled">false</bool>
</resources>

values-v31文件夹

<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="provision_mode_compliance_enabled">true</bool>
</resources>

最新更新