Как настроить GCM для контроллера политики устройств Android (DPC)
Я хочу использовать демонстрационное приложение TestDPC, выпущенное Google, для создания рабочего профиля со своим собственным контроллером политики устройства, поэтому я добавил некоторый код в это приложение, чтобы подключиться к службе GCM для получения облачных сообщений и запуска некоторых действий на моем устройстве.
Для подключения к GCM я использовал пример кода, который я тестировал отдельно, и он работает, единственное, что я добавил, это загрузочный приемник (ReceiverStarter), чтобы активировать приемник GCM каждый раз, когда пользователь перезагружает свое устройство.
Странно то, что когда я устанавливаю свое приложение на устройство (Samsung Note 4 с Android 5.1.1 API 22) без создания управляемого профиля, клиент GCM работает правильно.
Если с ранее установленным приложением я создаю рабочий профиль, а само приложение берет на себя управление новым профилем, то тот же код для GCM больше не работает. Я вижу (используя уведомления), что в этом случае мое приложение DPC может зарегистрироваться в GCM и получить идентификатор GCM, и я могу прочитать его в своей консоли, но слушатель (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>
Я не думаю, что это зависит от кода, так как я сказал, что одно и то же приложение и тот же код без рабочего профиля работают хорошо.
Есть идеи?
заранее спасибо
РЕДАКТИРОВАТЬ: здесь та же проблема
1 ответ
Насколько мне известно, ОС избегает вызова любых намерений управляемого профиля из личного профиля (если не предоставлены привилегии). Таким образом, хотя запрос зарезервирован для устройства из GCM, устройство не может инициировать действия вашего приложения, когда приложение находится в управляемом профиле.
То, что вам нужно сделать, это сохранить отдельный блок в личном профиле, который обрабатывает операции GCM. Вы можете предоставить привилегии определенным намерениям для совместного использования с управляемым профилем. Таким образом, вы можете отправить триггер через приложение в управляемый профиль с соответствующей информацией для операции. Дайте мне знать, если это не ясно.
Перейдите по этой ссылке (Обеспечение совместимости с управляемыми профилями), чтобы понять, как включить кросс-профильные намерения.