【问题标题】:Device owner QR stopped working on Android12 devices, getting Can't set up device message设备所有者 QR 在 Android12 设备上停止工作,收到无法设置设备消息
【发布时间】:2022-11-09 05:55:14
【问题描述】:

出于某种原因,以设备所有者身份安装我们的应用程序的 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"
}

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

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

CHECKSUM 是有效的,如果我弄乱它会引发不同的错误......

提前致谢。

【问题讨论】:

  • 谢谢@ToolmakerSteve 我已经查看了解决方案,但还不能使它工作,无论如何感谢链接
  • 嗨@Daniel,您找到解决此问题的方法了吗?我在三星设备上遇到了同样的问题。谢谢!
  • @AlessandroCaliaro 是的,我会在这里发布
  • 嗨@Daniel,您能发布您的解决方案吗?

标签: android android-12 device-policy-manager device-owner


【解决方案1】:

好吧,我最终通过以下方式解决了它

您必须再添加两个将处理新流程的活动 在这两项活动中,您都必须设定结果并完成活动

请注意,我注意到新方法在 Android12 上 100% 有效,但有时在 Android11 上失败,因此我通过检查存储在 XML 资源中的以下布尔值 provision_mode_compliance_enabled 使这个解决方案有条件,它在 Android 12+ 上启用

setResult(RESULT_OK, intent);
finish();

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>

值-v31 文件夹

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

【讨论】:

    猜你喜欢
    • 2017-05-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2018-04-16
    • 2019-07-17
    • 2016-04-03
    相关资源
    最近更新 更多