如何为 Android 设备策略控制器 (DPC) 配置 GCM



我想使用 Google 发布的演示应用程序 TestDPC 使用我自己的设备策略控制器创建工作配置文件,因此我向此应用程序添加了一些代码,以便连接到 GCM 服务以接收云消息以在我的设备上启动一些操作。
为了连接到 GCM,我使用了一些单独测试的示例代码并且它有效,我添加的唯一内容是启动侦听器 (ReceiverStarter(,以便在用户每次重新启动设备时激活 GCM 侦听器。
奇怪的是,当我在没有创建托管配置文件的情况下在设备(带有Android 4 API 4的三星Note 22(上安装我的应用程序时,GCM客户端可以正常工作。
如果在早期安装该应用程序的情况下,我创建了一个工作配置文件,并且该应用程序可以控制新的配置文件,则GCM的相同代码将不再有效。我可以看到(使用通知(在这种情况下,我的 dpc 应用程序可以注册到 GCM 并获取 GCM ID,我可以在我的控制台中读取它,但侦听器 (MyGcmListenerService( 没有收到任何云消息,就好像侦听器没有启动并运行一样,我在控制台中看不到任何错误和/或日志。
也许我需要更多的权限?
这是我的清单

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.xxx.emmagent.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.xxx.emmagent.permission.C2D_MESSAGE" />
<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme"
        android:label="@string/app_name">
    <activity
        android:name=".LaunchActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <activity
        android:name=".gcm.MainActivity"
        android:label="@string/app_name"
        android:theme="@style/SetupTheme"/>
    <activity
            android:name=".PolicyManagementActivity"
            android:label="@string/app_name"
            android:windowSoftInputMode="adjustPan"/>
    <activity
            android:name=".AddAccountActivity"
            android:label="@string/app_name"
            android:theme="@style/SetupTheme"/>
    <activity
            android:name=".EnableProfileActivity"
            android:label="@string/app_name"
            android:theme="@style/SetupTheme"/>
    <activity
            android:name=".EnableDeviceOwnerActivity"
            android:label="@string/app_name"
            android:theme="@style/SetupTheme"/>
    <activity
            android:name=".cosu.EnableCosuActivity"
            android:label="@string/app_name"
            android:theme="@style/SetupTheme"/>
    <activity
            android:name=".syncauth.SetupSyncAuthManagement"
            android:label="@string/app_name"
            android:theme="@style/SetupTheme"/>
    <activity
            android:name=".syncauth.FinishSyncAuthDeviceOwnerActivity"
            android:label="@string/app_name"
            android:theme="@style/SetupTheme"/>
    <activity
            android:name=".syncauth.FinishSyncAuthProfileOwnerActivity"
            android:label="@string/app_name"
            android:theme="@style/SetupTheme"/>
    <activity
            android:name=".policy.locktask.KioskModeActivity"
            android:label="@string/kiosk_mode"
            android:launchMode="singleInstance"
            android:lockTaskMode="if_whitelisted"
            android:enabled="false">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.HOME"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
    <receiver
            android:name=".DeviceAdminReceiver"
            android:description="@string/app_name"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
        <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin_receiver"/>
        <intent-filter>
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
            <action android:name="android.app.action.PROFILE_PROVISIONING_COMPLETE"/>
        </intent-filter>
    </receiver>
    <provider
            android:authorities="com.xxx.emmagent.fileprovider"
            android:name="android.support.v4.content.FileProvider"
            android:grantUriPermissions="true"
            android:exported="false">
        <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
    </provider>

    <!-- GCM messagging -->
    <!-- [START gcm_receiver] -->
    <receiver
        android:name="com.google.android.gms.gcm.GcmReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.xxx.emmagent" />
        </intent-filter>
    </receiver>
    <!-- [END gcm_receiver] -->
    <!-- [START gcm_listener] -->
    <service
        android:name=".gcm.MyGcmListenerService"
        android:exported="true" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>
    <!-- [END gcm_listener] -->
    <!-- [START instanceId_listener] -->
    <service
        android:name=".gcm.MyInstanceIDListenerService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.android.gms.iid.InstanceID"/>
        </intent-filter>
    </service>
    <!-- [END instanceId_listener] -->
    <service
        android:name=".gcm.RegistrationIntentService"
        android:exported="false">
    </service>
    <receiver android:name=".gcm.ReceiverStarter" android:enabled="true" android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>
</application>

我不认为这取决于代码,正如我所说,没有工作配置文件的相同应用程序和相同代码效果很好。
有什么想法吗?
提前致谢

编辑:这里有同样的问题

我所知,操作系统也避免从个人配置文件触发任何托管配置文件意图(除非授予权限(。因此,尽管请求是从 GCM 保留给设备的,但当应用位于托管配置文件中时,设备无法触发应用的活动。

您所要做的就是在个人配置文件中保留一个单独的单元,用于处理接收 GCM 操作。您可以向某些意向授予权限,以便与托管配置文件交叉共享。这样,可以通过意向将触发器发送到托管配置文件中的应用,并提供与操作相关的信息。如果不清楚,请告诉我。

请浏览此链接(确保与托管配置文件的兼容性(以了解启用跨配置文件意图。

相关内容

  • 没有找到相关文章

最新更新