如何为Android设备策略控制器(DPC)配置GCM
我想使用谷歌发布的演示应用程序,用我自己的设备策略控制器创建一个工作配置文件,所以我在这个应用程序中添加了一些代码,以便连接到GCM服务,接收云消息,在我的设备上启动一些操作。如何为Android设备策略控制器(DPC)配置GCM,android,google-cloud-messaging,android-5.1.1-lollipop,android-managed-profile,Android,Google Cloud Messaging,Android 5.1.1 Lollipop,Android Managed Profile,我想使用谷歌发布的演示应用程序,用我自己的设备策略控制器创建一个工作配置文件,所以我在这个应用程序中添加了一些代码,以便连接到GCM服务,接收云消息,在我的设备上启动一些操作。 为了连接到GCM,我使用了一些我单独测试过的示例代码,它可以正常工作,我唯一添加的是一个引导侦听器(ReceiverStarter),以便在用户每次重新启动设备时激活GCM侦听器。 奇怪的是,当我在设备上安装我的应用程序(三星Note 4,Android 5.1.1 API 22)而不创建托管配置文件时,GCM客户端工作
为了连接到GCM,我使用了一些我单独测试过的示例代码,它可以正常工作,我唯一添加的是一个引导侦听器(ReceiverStarter),以便在用户每次重新启动设备时激活GCM侦听器。
奇怪的是,当我在设备上安装我的应用程序(三星Note 4,Android 5.1.1 API 22)而不创建托管配置文件时,GCM客户端工作正常。
如果应用程序提前安装,我创建了一个工作配置文件,并且应用程序itslef控制了新配置文件,那么GCM的相同代码将不再工作。 我可以看到(使用通知),在这种情况下,我的dpc应用程序可以注册到GCM并获取GCM ID,我可以在控制台中读取它,但侦听器(MyGcmListenerService)没有收到任何云消息,就好像侦听器没有启动并运行一样,我在控制台中看不到任何错误和/或日志。
也许我需要更多的权限?
这是我的舱单
<?xml version="1.0" encoding="utf-8"?>
同样的问题据我所知,操作系统也避免从个人配置文件触发任何托管配置文件意图(除非授予特权)。因此,尽管请求是从GCM保留给设备的,但当应用程序位于托管配置文件中时,设备无法触发应用程序的活动
你需要做的是在个人档案中保留一个单独的单元,处理接收GCM操作。您可以将权限授予某些要交叉共享到托管配置文件的对象。通过这种方式,您可以通过意图将触发器发送到托管配置文件中的应用程序,并将相关信息发送到操作。
如果不清楚,请告诉我
请通读以了解启用跨配置文件意图。据我所知,操作系统也避免从个人配置文件触发任何托管配置文件意图(除非授予特权)。因此,尽管请求是从GCM保留给设备的,但当应用程序位于托管配置文件中时,设备无法触发应用程序的活动
你需要做的是在个人档案中保留一个单独的单元,处理接收GCM操作。您可以将权限授予某些要交叉共享到托管配置文件的对象。通过这种方式,您可以通过意图将触发器发送到托管配置文件中的应用程序,并将相关信息发送到操作。
如果不清楚,请告诉我
请通读一遍以了解启用跨配置文件的意图。我只想澄清您的问题,根据我的理解,问题是侦听器在空闲状态下没有收到任何消息?DPC和GCM之间的关系是什么?@d.datul1990:Hi,我试图澄清这个问题:问题是侦听器在空闲状态下没有收到任何消息?是的,但不仅在空闲状态下,应用程序在任何状态下都无法接收任何消息。DPC和GCM的关系是什么?我认为这是有关系的,因为如果我不在“Android for Work”的DPC应用程序中使用相同的代码,那么同样的代码也可以工作。不幸的是,我不能说“如何”,但我已经解决了这个问题……我想这只是GCM的配置问题。现在,即使在托管配置文件中,我也可以毫无问题地接收GCM消息。对不起,我不能再说了。我只是想澄清一下你的问题,根据我的理解,问题是听者在空闲状态下没有收到任何消息?DPC和GCM之间的关系是什么?@d.datul1990:Hi,我试图澄清这个问题:问题是侦听器在空闲状态下没有收到任何消息?是的,但不仅在空闲状态下,应用程序在任何状态下都无法接收任何消息。DPC和GCM的关系是什么?我认为这是有关系的,因为如果我不在“Android for Work”的DPC应用程序中使用相同的代码,那么同样的代码也可以工作。不幸的是,我不能说“如何”,但我已经解决了这个问题……我想这只是GCM的配置问题。现在,即使在托管配置文件中,我也可以毫无问题地接收GCM消息。很抱歉,我不能再多说了。谢谢Pasindu,我不太明白为什么在托管配置文件中,我不能接收云消息,即使我知道这是由于安全限制。你的解决方案对我来说很清楚,实际上我已经测试过类似于配置从非托管配置文件到托管配置文件的交叉意图,但我希望在我的托管配置文件中的一个应用程序中完成所有操作,我将做一些其他测试,然后再给你写信。谢谢你!与我们分享结果,它可能对很多人有用,因为这款Android for Work非常新。不幸的是,我不能说“如何”,但我已经解决了这个问题……我认为这只是GCM的配置问题。现在,即使在托管配置文件中,我也可以毫无问题地接收GCM消息。很抱歉,我不能再多说了。谢谢Pasindu,我不太明白为什么在托管配置文件中,我不能接收云消息,即使我知道这是由于安全限制。你的解决方案对我来说很清楚,实际上我已经测试过类似于配置从非托管配置文件到托管配置文件的交叉意图,但我希望在我的托管配置文件中的一个应用程序中完成所有操作,我将做一些其他测试,然后再给你写信。谢谢你!与我们分享结果,它可能对很多人有用,因为这款Android for Work非常新。不幸的是,我不能说“如何”,但我已经解决了这个问题……我认为这只是GCM的配置问题。现在,即使在托管配置文件中,我也可以毫无问题地接收GCM消息。对不起,我不能再说了。
<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>