1

Google がリリースしたデモ アプリケーションTestDPCを使用して、独自のデバイス ポリシー コントローラーで Work Profile を作成したいので、このアプリにコードを追加して、GCM サービスに接続し、クラウド メッセージを受信して​​デバイスでいくつかのアクションを開始します。
GCM に接続するために、個別にテストしたいくつかのサンプル コードを使用して動作しました。追加したのは、ユーザーがデバイスを再起動するたびに GCM リスナーをアクティブにするためのブート リスナー ( ReceiverStarter ) だけです。
奇妙なことに、管理プロファイルを作成せずにデバイス (Samsung Note 4 with Android 5.1.1 API 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>

仕事用プロファイルのない同じアプリと同じコードがうまく機能すると言ったので、コードに依存するとは思いません。
何か案は?
前もって感謝します

編集ここで同じ問題

4

1 に答える 1

0

私の知る限り、OSは個人プロファイルからも管理対象プロファイルのインテントをトリガーすることを回避します(権限を付与しない限り)。そのため、リクエストは GCM からデバイスに予約されていますが、アプリがマネージド プロファイルにある場合、デバイスはアプリのアクティビティをトリガーできません。

あなたがしなければならないことは、GCM操作の受信を処理する個人プロファイルに別のユニットを保持することです. 特定のインテントに権限を付与して、マネージド プロファイルに相互共有することができます。このようにして、操作に関連する情報を使用して、マネージド プロファイル内のアプリにインテントを介してトリガーを送信できます。不明な場合はお知らせください。

このリンク (マネージド プロファイルとの互換性の確保)にアクセスして、クロス プロファイル インテントの有効化について理解してください。

于 2016-03-11T06:50:14.717 に答える