公司拥有的完全托管设备的QR码配置

时间:2018-11-28 12:46:13

标签: android qr-code provisioning

我正在尝试使用QR码设置方法在新的出厂重置平板电脑上安装自定义DPC。我已经创建了JSON并将其转换为QR码以进行扫描。

我能够扫描QR码,并且自定义dpc应用已成功安装。之后,将显示我的设备启动器屏幕。我期望像onEnableonprofileprovisioningcompleted这样的deviceadmin接收器方法被调用。我正在尝试从onprofileprovisingcompleted方法开始我的活动。

我想自动启动活动,而无需用户干预。我的家庭Activity和deviceadminreceiver是dpc应用程序的一部分。我无法弄清为什么不调用这些方法。

我还添加了toast语句和Notifications,但它们从未执行过。请指教。

平板电脑上的操作系统为:牛轧糖。请找到下面的代码。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="fateh.com.my.fatehdpc">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />

        </intent-filter>
    </activity>

    <receiver
        android:name=".MyDeviceAdminReceiver"
        android:label="DevicePolicyAdminReceiver"
        android:permission="android.permission.BIND_DEVICE_ADMIN"
        android:exported="true">
        <meta-data
            android:name="android.app.device_admin"
            android:resource="@xml/device_admin" />

        <intent-filter>
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            <action android:name="android.app.action.PROFILE_PROVISIONING_COMPLETE"/>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.app.action.PROFILE_OWNER_CHANGED"/>
            <action android:name="android.app.action.DEVICE_OWNER_CHANGED"/>

        </intent-filter>
    </receiver>

    <receiver
        android:name=".BootReceiver"
        android:enabled="true" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

</application>

MyDeviceAdminReceiver类文件

public class MyDeviceAdminReceiver extends DeviceAdminReceiver
{
    public static final String ACTION_PASSWORD_REQUIREMENTS_CHANGED =
            "com.afwsamples.testdpc.policy.PASSWORD_REQUIREMENTS_CHANGED";

    void showToast(Context context, String msg) {

       // Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
        showNotification(context,msg);
    }

    public void showNotification(Context context, String message) {


        // Create Notification using NotificationCompat.Builder
        NotificationCompat.Builder builder = new NotificationCompat.Builder(
                context)
                // Set Icon

                // Set Ticker Message
                .setTicker(message)
                // Set Title
                .setContentTitle("Testing")
                // Set Text
                .setContentText(message)
                // Add an Action Button below Notification

                // Set PendingIntent into Notification

                // Dismiss Notification
                .setAutoCancel(false);

        // Create Notification Manager
        NotificationManager notificationmanager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        // Build Notification with Notification Manager
        notificationmanager.notify(0, builder.build());

    }
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("Nadeem",
                "MyDevicePolicyReciever Received: " + intent.getAction());
        switch (intent.getAction()) {
            case ACTION_PASSWORD_REQUIREMENTS_CHANGED:
            case Intent.ACTION_BOOT_COMPLETED:
                Toast.makeText(context,"onReceive invoked ACTION_PASSWORD_REQUIREMENTS_CHANGED ACTION_BOOT_COMPLETED", Toast.LENGTH_LONG)
                        .show();
                break;
            case DevicePolicyManager.ACTION_PROFILE_OWNER_CHANGED:
                Toast.makeText(context,"onReceive invoked ACTION_PROFILE_OWNER_CHANGED", Toast.LENGTH_LONG)
                        .show();

                break;
            case DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED:
                Toast.makeText(context,"onReceive invoked ACTION_DEVICE_OWNER_CHANGED", Toast.LENGTH_LONG)
                        .show();

                break;
            default:
                Toast.makeText(context,"onReceive invoked ACTION_DEVICE_OWNER_CHANGED", Toast.LENGTH_LONG)
                        .show();
                super.onReceive(context, intent);
                break;
        }

    }

    @Override
    public void onEnabled(Context context, Intent intent) {

        UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
        long serialNumber = userManager.getSerialNumberForUser(Binder.getCallingUserHandle());
        showToast(context,"Device admin enabled in user with serial number: " + serialNumber);

    }

    @Override
    public void onDisabled(Context context, Intent intent) {

        showToast(context,"Device owner disabled");
    }



    @Override
    public void onProfileProvisioningComplete(Context context, Intent intent) {
        try
        {
            showToast(context,"onProfileProvisioningComplete");
            Intent launch = new Intent(context, MainActivity.class);
            launch.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(launch);
        }
        catch (Exception e)
        {
            Log.d("nadeem", "onProfileProvisioningComplete Error " + e);
            showToast(context,"onProfileProvisioningComplete Error " + e);
        }

    }

    public static ComponentName getComponentName(Context context) {
        return new ComponentName(context.getApplicationContext(), MyDeviceAdminReceiver.class);
    }

}

MainActivity:它只有一个按钮的空白活动。

2 个答案:

答案 0 :(得分:0)

使用NFC设置时,我遇到了同样的问题。错误发生在AndroidManifest.xml的“接收器”声明中(属性已导出=“ false”)。

在“接收器”声明上,将其“导出”设置为export =“ true”。 您也将其添加到下一个操作中:“ android.app.action.DEVICE_ADMIN_ENABLED”和“ android.app.action.PROFILE_PROVISIONING_COMPLETE”

答案 1 :(得分:0)

我刚刚遇到了同样的问题,并找到了解决方案。从问题中的代码片段中,我们可以看到 onReceive 被覆盖,但 super.onReceive() 仅在有时被调用(当 switch 语句达到 default case 时)。 >

普通的BroadcastReceiver只有an abstract onReceive,这意味着不需要调用super

但是,在实现 DeviceAdmin 时,您扩展了 DeviceAdminReceiver,它具有 an important implementation for onReceive

 999    /**
1000     * Intercept standard device administrator broadcasts.  Implementations
1001     * should not override this method; it is better to implement the
1002     * convenience callbacks for each action.
1003     */
1004    @Override
1005    public void onReceive(Context context, Intent intent) {
1006        String action = intent.getAction();
1007
1008        if (ACTION_PASSWORD_CHANGED.equals(action)) {
1009            onPasswordChanged(context, intent, intent.getParcelableExtra(Intent.EXTRA_USER));
1010        } else if (ACTION_PASSWORD_FAILED.equals(action)) {
1011            onPasswordFailed(context, intent, intent.getParcelableExtra(Intent.EXTRA_USER));
1012        } else if (ACTION_PASSWORD_SUCCEEDED.equals(action)) {
1013            onPasswordSucceeded(context, intent, intent.getParcelableExtra(Intent.EXTRA_USER));
1014        } else if (ACTION_DEVICE_ADMIN_ENABLED.equals(action)) {
1015            onEnabled(context, intent);
1016        } else if (ACTION_DEVICE_ADMIN_DISABLE_REQUESTED.equals(action)) {
1017            CharSequence res = onDisableRequested(context, intent);
1018            if (res != null) {
1019                Bundle extras = getResultExtras(true);
1020                extras.putCharSequence(EXTRA_DISABLE_WARNING, res);
1021            }
1022        } else if (ACTION_DEVICE_ADMIN_DISABLED.equals(action)) {
1023            onDisabled(context, intent);
1024        } else if (ACTION_PASSWORD_EXPIRING.equals(action)) {
1025            onPasswordExpiring(context, intent, intent.getParcelableExtra(Intent.EXTRA_USER));
1026        } else if (ACTION_PROFILE_PROVISIONING_COMPLETE.equals(action)) {
1027            onProfileProvisioningComplete(context, intent);
1028        } else if (ACTION_CHOOSE_PRIVATE_KEY_ALIAS.equals(action)) {
...

这个 onReceive 的默认实现是使所有回调工作的原因。因此,在不调用 super 的情况下覆盖它会阻止所有回调工作。

我在实现接收器时犯了类似的错误。添加对 super.onReceive() 的呼叫已为我修复。

我知道这个答案很晚了,但希望它对某人有所帮助。