엔터프라이즈 모바일 관리 (EMM) 공급업체는 조직을 위한 솔루션을 제공합니다
Android 기기와 기기에 설치된 앱을 관리할 수 있습니다. 이러한 솔루션은
일반적으로 EMM 콘솔이라고 하는 웹 콘솔로 제공됩니다. EMM 사용
콘솔을 사용하여 IT 관리자가 고객을 대신하여 기기 및 앱 관리 작업을
되었습니다.
기업 조직을 대상으로 하는 앱은 다음과 같은 형식으로 EMM에 의견을 보낼 수 있습니다.
표시됩니다. EMM이 키 앱 상태 데이터를 가져오는 데 사용할 수 있는 API
EMM 콘솔에 표시할 수 있습니다 이 커뮤니케이션 채널
IT 관리자는 기기에 설치된 앱의 상태에 대한 피드백을 받을 수 있습니다.
직접 관리할 수 있습니다.
예를 들어 이메일 클라이언트 앱은 키 입력 앱 상태를 사용하여
동기화 오류가 발생하면 보고하거나
앱 개발자가 적절하다고 생각하는 기타 상태 업데이트
키 지정 앱 상태의 구성요소
키가 있는 앱 상태는 다음으로 구성됩니다.
키: 앱 상태의 고유 식별자입니다. 최대 100자(영문 기준)까지 허용됩니다.
메시지: 앱 상태를 설명하는 메시지입니다(선택사항). 최대 1,000
있습니다. 참고: 일반적으로 메시지는 이보다 훨씬 짧습니다.
데이터: IT 관리자가 읽을 수 있도록 EMM에서 읽을 수 있는 값(선택사항)
값을 기준으로 알림 또는 필터를
설정할 수 있습니다 예를 들어 IT 관리자는
데이터 필드가 battery_percentage < 10이면 알림을 설정합니다. 최대 1,000
있습니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-26(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-07-26(UTC)"],[],[],null,["# Send app feedback to EMMs\n\nEnterprise mobility management (EMM) providers offer solutions for organizations\nto manage Android devices and the apps installed on them. These solutions are\ntypically available as web consoles, called *EMM consoles*. Using an EMM\nconsole, IT admins perform device and app management tasks on behalf of their\norganization.\n\nApps targeting enterprise organizations can send feedback to EMMs in the form of\nkeyed app states. APIs are available for EMMs to retrieve keyed app state data,\nwhich they can then display in their EMM console. This communication channel\nallows IT admins to receive feedback about the status of the apps installed on\nthe devices they manage.\n\nFor example, an email client app could use keyed app states to confirm that an\naccount was successfully configured, report when sync errors occur, or send any\nother status updates the app developer thinks is appropriate.\n\n### Components of a keyed app state\n\nA keyed app state is comprised of the following:\n\n- **Key:** Unique identifier for the app state. Maximum 100 characters.\n- **Message:** Optional message describing the app state. Maximum 1000 characters. Note: Typically messages should be significantly shorter than this.\n- **Data:** Optional machine-readable value intended for EMMs to allow IT admins to set up alerts or filters based on the value. For example, an IT admin could set up an alert if the data field `battery_percentage \u003c 10`. Maximum 1000 characters.\n- **Severity:** The severity of the app state. Allowable values are [`SEVERITY_ERROR`](/reference/androidx/enterprise/feedback/KeyedAppState#SEVERITY_ERROR) and [`SEVERITY_INFO`](/reference/androidx/enterprise/feedback/KeyedAppState#SEVERITY_INFO) (default). Only set severity to [`SEVERITY_ERROR`](/reference/androidx/enterprise/feedback/KeyedAppState#SEVERITY_ERROR) for genuine error conditions that an organization needs to take action to fix.\n- **Timestamp:**When a keyed app state is set, it's automatically sent with a timestamp in milliseconds since epoch.\n\nSend managed configurations feedback\n------------------------------------\n\nIf your app supports [managed configurations](/work/managed-configurations),\nsending keyed app states is recommended as a way to update IT admins on the\nstatus of the configurations they set. The following example workflow describes\none way to do this.\n\n1. IT admins use their EMM console to set and send managed configurations for an app installed on a [fully managed device](https://developers.google.com/android/work/terminology#fully_managed_device) or inside a [work profile](https://developers.google.com/android/work/terminology#work_profile). For example:\n - Volume: '50%'\n - Currency: 'USDD'\n2. The app attempts to apply the configurations. The volume is set successfully to 50%, but the currency code is invalid and can't be applied.\n3. Based on the status of each configuration, the app sets a keyed app state. Each keyed app state contains a unique key and a message with details of the state. We recommend matching the managed configurations key where possible. For example:\n\n | Key | Message | Severity | Timestamp |\n |------------|--------------------------------|------------------------------------------------------------------------------------------|--------------|\n | `volume` | Set to 50% | [`SEVERITY_INFO`](/reference/androidx/enterprise/feedback/KeyedAppState#SEVERITY_INFO) | `1554461130` |\n | `currency` | Currency 'USDD' not recognized | [`SEVERITY_ERROR`](/reference/androidx/enterprise/feedback/KeyedAppState#SEVERITY_ERROR) | `1554461130` |\n\n4. The EMM provider retrieves the keyed app states set by the app and displays them in its EMM console. For example:\n\n | Configuration | Status | Action required | Time |\n |---------------|----------------------------------------|-----------------|----------------------------|\n | Volume | Set to 50% | No | April 5, 2019; 10:45:30 AM |\n | Currency | ERROR: Currency 'USDD' not recognized. | Yes | April 5, 2019; 10:45:30 AM |\n\n The EMM provider should also explicitly flag any received states with\n [`SEVERITY_ERROR`](/reference/androidx/enterprise/feedback/KeyedAppState#SEVERITY_ERROR)\n to the IT admin. IT admins can view the information in their EMM console and\n take action to rectify any errors in the configurations they set.\n\n### Report resolved errors\n\nAfter an error is resolved, immediately send a follow-up app state to\nprevent EMMs from displaying the error message indefinitely. This follow-up\nstate should include:\n\n- The same [key](/reference/androidx/enterprise/feedback/KeyedAppState#getKey()) as the initial error message.\n- A severity of [`SEVERITY_INFO`](/reference/androidx/enterprise/feedback/KeyedAppState#SEVERITY_INFO), which indicates that the state isn't in an error condition and doesn't require the organization to take any further action.\n\nAdd support for keyed app states to your app\n--------------------------------------------\n\nThe steps below describe how to integrate keyed app states in your app.\n\n### Step 1: Add Google's Maven repository to your `settings.gradle` file\n\nAdd Google's Maven repository as a repository location in your project's [`settings.gradle`](/studio/build#settings-file)\nfile, as shown below: \n\n```\ndependencyResolutionManagement {\n repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n repositories {\n google()\n }\n}\n```\n\n### Step 2: Add the enterprise feedback library to your module-level `build.gradle` file\n\nAdd the following dependency to your module-level [`build.gradle`](/studio/build#module-level)\nfile: \n\n```\ndependencies {\n implementation 'androidx.enterprise:enterprise-feedback:1.0.0'\n}\n```\n\n### Step 3: Get an instance of `KeyedAppStatesReporter`\n\nIn your `onCreate()` method, get and store an instance of\n[`KeyedAppStatesReporter`](/reference/androidx/enterprise/feedback/KeyedAppStatesReporter).\nThis enables a communication channel between your app and EMM providers. \n\n### Kotlin\n\n```kotlin\nval reporter = KeyedAppStatesReporter.create(context)\n```\n\n### Java\n\n```java\nKeyedAppStatesReporter reporter = KeyedAppStatesReporter.create(context);\n```\n\n### Step 4: Create a collection of keyed app states\n\nFollow the best practices outlined below when creating keyed app states:\n\n- Never include personally identifiable information (PII) in a state---keyed apps states aren't suitable for sensitive data.\n- Keep keyed app states within the limits defined in [`MAX_KEY_LENGTH`](/reference/androidx/enterprise/feedback/KeyedAppState#MAX_KEY_LENGTH), [`MAX_MESSAGE_LENGTH`](/reference/androidx/enterprise/feedback/KeyedAppState#MAX_MESSAGE_LENGTH), and [`MAX_DATA_LENGTH`](/reference/androidx/enterprise/feedback/KeyedAppState#MAX_DATA_LENGTH).\n- A single `setStates` or `setStatesImmediate` call is limited to 300 KB total (approximately 1/3 of the total that can be stored per day). Exceeding this will result in undefined behavior.\n- Only set the severity of a state to [`SEVERITY_ERROR`](/reference/androidx/enterprise/feedback/KeyedAppState#SEVERITY_ERROR) if a condition exists that an organization needs to take action to fix.\n- When sending an app state containing errors, ensure that you also send a follow-up state when the errors are resolved so the EMM can stop flagging the errors in their console.\n- For the follow-up state, use the same [key](/reference/androidx/enterprise/feedback/KeyedAppState#getKey()) as the initial state that returned the error and set severity to [`SEVERITY_INFO`](/reference/androidx/enterprise/feedback/KeyedAppState#SEVERITY_INFO).\n\nThe snippet below creates a collection of keyed app states: \n\n### Kotlin\n\n```kotlin\n val states = hashSetOf(KeyedAppState.builder()\n .setKey(\"key\")\n .setSeverity(KeyedAppState.SEVERITY_INFO)\n .setMessage(\"message\")\n .setData(\"data\")\n .build())\n \n```\n\n### Java\n\n```java\n Collection states = new HashSet\u003c\u003e();\n states.add(KeyedAppState.builder()\n .setKey(\"key\")\n .setSeverity(KeyedAppState.SEVERITY_INFO)\n .setMessage(\"message\")\n .setData(\"data\")\n .build());\n \n```\n\n### Step 5: Set the keyed app states\n\n| **Note:** You can set up to 500 unique keys per day for your app. There's no limit to the number of states you can set for each unique key.\n\nThe [`setStates()`](/reference/androidx/enterprise/feedback/KeyedAppStatesReporter#setStates(java.util.Collection\u003candroidx.enterprise.feedback.KeyedAppState\u003e))\nmethod immediately sends keyed app states to the Play Store app (package name:\n`com.android.vending`) if it's installed on the device, as well as any admins of the\ndevice or work profile. \n\n### Kotlin\n\n```kotlin\nkeyedAppStatesReporter.setStates(states)\n```\n\n### Java\n\n```java\nkeyedAppStatesReporter.setStates(states);\n```\n\nTest keyed app states\n---------------------\n\nFor detailed test instructions, see [Test app feedback](/work/app-feedback/testing)."]]