Configuration of TheFlex with Intune
An MDM (Mobile Device Management System) is a software solution that helps businesses manage and secure mobile devices such as smartphones, tablets, and laptops. MDM systems allow organizations to remotely monitor, configure, and control devices, regardless of location or the network they are connected to. MDM systems are particularly useful for companies with a large number of employees accessing corporate resources through mobile devices.
The following article describes the procedure for configuring the Android version of TheFlex with Microsoft Intune.
Create an app-configuration policy
Visit the Microsoft Endpoint Manager website and log in with your credentials. Navigate to Apps and select App configuration policies.
Click on Create new policy and select Managed Devices.
There you can select TheFlex as the name, Android Enterprise as the target platform, a corresponding profile type and finally the app TheFlex.
Configuration of the settings
Optionally, you can directly activate the required authorizations for TheFlex. The following authorizations are required for TheFlex:
- WiFi
- NFC
- Bluetooth
- Camera
- GPS
- Flashlight
- Vibrate
- Audio
- Read Storage
- Write Storage
The next step is to configure the TheFlex-specific settings. As the most important and mandatory setting is the start pages, this cannot be done via the Intunes interface. The reason for this is that several start pages can be configured and this function is not supported by Intunes.
For this reason, the settings must be entered as JSON data:
Intune automatically generates sample data. The recommendation is to copy this into another program such as Notepad++ and edit it there.
Configuration of normal settings
Most settings are predefined as either "true" or a number. These can be adjusted to the appropriate value as required or left at the default value.
Important: Intune automatically writes the value STRING_VALUE for all text settings. This must at least be replaced by an empty string "". However, it is recommended to replace this STRING_VALUE with a valid setting:
| Setting | Possible values (always enter in "") |
|---|---|
| Additional displays | "none", "PROGLOVE_MARK_DISPLAY_SDK", "NIMMSTA_HS50_SDK" |
| Keyboard behavior | "default", "deactivated", "Active_on_tap" |
| Language | "de_DE", "en_EN" |
| Logging | "ERROR", "WARN", "INFO", "DEBUG" |
Configuration of the license
The license code can be entered as valueString under the flx_license key. The license code must also be placed in quotation marks here, otherwise it will not be recognized as valid by Intune.
Configuration of the start pages
At least one start page must be configured, otherwise TheFlex will reject the configuration as invalid and reset it. To do this, at least one managedProperty must be added or configured in the fioriURL_Configuration section:
- fioriURLName: Name of the start page (mandatory, must not be empty)
- fioriURL: URL of the start page (mandatory, must not be empty)
- fioriURLUsername: Optional SAP user
- fioriURLPassword: Optional SAP password
At the end of this article is a valid configuration as JSON. This can be copied into Microsoft Intune. It is recommended to insert a valid license code directly.
In some cases, it may be useful to transfer all settings to the devices via Intune except for the username and password.
This may be necessary if all settings are to be centrally managed, but users still need to be able to save their personal login credentials for certain startpages.
To enable this with Intune, a "/" (a single slash) must be entered as fioriURLUsername and fioriURLPassword in Intune. If the device receives a "/", it will not overwrite the local setting.
Selection of user groups
The next step is to configure which device or user groups this configuration policy should apply to.
The app and Intune settings are then automatically distributed to all selected devices.
If TheFlex was already installed and configured, for example for local testing, the settings must be reseted. This can be done either in the TheFlex or the general Android settings.
Example JSON for an Intune configuration
The following JSON contains all available TheFlex settings. Copy it into Intune’s JSON editor and adjust the values as needed. Keys you don’t need can simply be removed.
{
"kind": "androidenterprise#managedConfiguration",
"productId": "app:de.flexus.apps.theflex",
"managedProperty": [
{ "key": "flx_license", "valueString": "" },
{
"key": "fioriURL_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "fioriURLName", "valueString": "My App" },
{ "key": "fioriURL", "valueString": "https://my-sap-system.example.com" },
{ "key": "fioriURLUsername", "valueString": "" },
{ "key": "fioriURLPassword", "valueString": "" }
]
}
]
},
{ "key": "menuStartpagesEnabled", "valueBool": true },
{
"key": "menuStartpage_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "menuStartpageTitle", "valueString": "Picking" },
{ "key": "menuStartpageUrl", "valueString": "https://my-sap-system.example.com/picking" },
{ "key": "menuStartpageFolder", "valueString": "Warehouse/Zone A" }
]
},
{
"managedProperty": [
{ "key": "menuStartpageTitle", "valueString": "Goods Receipt" },
{ "key": "menuStartpageUrl", "valueString": "https://my-sap-system.example.com/goods-receipt" },
{ "key": "menuStartpageFolder", "valueString": "Warehouse/Zone A" }
]
},
{
"managedProperty": [
{ "key": "menuStartpageTitle", "valueString": "Inventory" },
{ "key": "menuStartpageUrl", "valueString": "https://my-sap-system.example.com/inventory" },
{ "key": "menuStartpageFolder", "valueString": "Warehouse" }
]
},
{
"managedProperty": [
{ "key": "menuStartpageTitle", "valueString": "Dashboard" },
{ "key": "menuStartpageUrl", "valueString": "https://my-sap-system.example.com/dashboard" },
{ "key": "menuStartpageFolder", "valueString": "" }
]
}
]
},
{ "key": "adminPassword", "valueString": "" },
{ "key": "requirePasswordLaunchpad", "valueBool": false },
{ "key": "SslUntrustIgnore", "valueBool": false },
{ "key": "flxBlockCopyPaste", "valueBool": false },
{ "key": "FlxCertChooser", "valueBool": false },
{ "key": "FlxUseSmartcard", "valueBool": false },
{ "key": "NFCConfig", "valueString": "" },
{ "key": "FlxPdfViewerEnabled", "valueBool": true },
{ "key": "FlxProgressIndicator", "valueBool": true },
{ "key": "FlxDebugMode", "valueBool": false },
{ "key": "FLXShowStatusBar", "valueBool": true },
{ "key": "FLXShowNavigationBar", "valueBool": true },
{ "key": "FlxToolbarOverlap", "valueBool": true },
{ "key": "FlxShowCloseButton", "valueBool": false },
{ "key": "FlxKeepScreenOn", "valueBool": false },
{ "key": "FlxConnectionStatus", "valueBool": false },
{ "key": "ZoomAmount", "valueInteger": 100 },
{ "key": "flxSelectedLanguage", "valueString": "" },
{ "key": "FLXSoftInputModeResize", "valueBool": true },
{ "key": "flxKeyboardPreferences", "valueString": "default" },
{ "key": "flxPairedDevice", "valueString": "none" },
{ "key": "flxPairedDevice_ScanMode", "valueString": "default" },
{ "key": "ClearSessions", "valueBool": true },
{ "key": "ClearCacheOnExit", "valueBool": true },
{ "key": "ClearCookieOnSwitchingLaunchpad","valueBool": true },
{ "key": "ClearCacheOnSwitchingLaunchpad", "valueBool": true },
{ "key": "LogLevel", "valueString": "ERROR" },
{
"key": "customScript_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "customScriptDescription", "valueString": "My Script" },
{ "key": "customScriptName", "valueString": "https://my-sap-system.example.com*" },
{ "key": "customScriptCode", "valueString": "console.log(‘TheFlex ready’);" },
{ "key": "customScriptActive", "valueBool": true }
]
}
]
},
{
"key": "customCSSSet_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "customCSSDescription", "valueString": "My CSS" },
{ "key": "customCSSName", "valueString": "https://my-sap-system.example.com*" },
{ "key": "customCSSCode", "valueString": "body { font-size: 16px; }" },
{ "key": "customCSSActive", "valueBool": true }
]
}
]
},
{
"key": "customKeyboardSet_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "inputType", "valueString": "default" },
{ "key": "cKeyboard", "valueString": "{ ‘rows’: [{ ‘buttons’: [{ ‘text’: ‘ENTER’, ‘function’: ‘ENTER’, ‘color’: ‘#ffff33’, ‘weight’: 1 }] }] }" },
{ "key": "customParameter", "valueString": "" }
]
}
]
},
{
"key": "scanConfig_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "scanConfigName", "valueString": "EAN-13" },
{ "key": "scanConfigLengthRule", "valueString": "EXACT" },
{ "key": "scanConfigMatchLength", "valueInteger": 13 },
{ "key": "scanConfigMatchText", "valueString": "" },
{
"key": "scanConfigActions",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "scanConfigActionType", "valueString": "CUT_FIRST" },
{ "key": "scanConfigActionCount", "valueInteger": 1 },
{ "key": "scanConfigActionText", "valueString": "" }
]
}
]
}
]
}
]
}
]
}
JSON does not support comments. The structure above is for readability in this documentation only. Simply remove entries you don’t need before pasting into Intune.
Explanation of all Intune JSON keys
License
| Key | Type | Description |
|---|---|---|
flx_license | string | TheFlex license key |
Classic start pages (fioriURL_Configuration)
| Key | Type | Description |
|---|---|---|
fioriURLName | string | Display name (required) |
fioriURL | string | URL to open (required) |
fioriURLUsername | string | SAP username – use "/" to preserve the local value |
fioriURLPassword | string | SAP password – use "/" to preserve the local value |
Menu start pages
| Key | Type | Default | Description |
|---|---|---|---|
menuStartpagesEnabled | bool | false | Activates the folder-based menu navigation. Note: When enabled, the classic start pages (fioriURL_Configuration) are no longer shown in the menu. |
menuStartpageTitle | string | – | Display label |
menuStartpageUrl | string | – | URL to open |
menuStartpageFolder | string | "" | Folder path for this entry. Use "/" as separator for nested subfolders, e.g. "Warehouse/Zone A". All entries with the same path appear in the same folder. Leave empty ("") to place the entry at the root level (no folder). |
The value of menuStartpageFolder determines where in the menu the entry appears:
| Value | Position in the menu |
|---|---|
"" | Root level – directly in the menu, not inside any folder |
"Warehouse" | Inside folder Warehouse |
"Warehouse/Zone A" | Inside subfolder Zone A, which is inside Warehouse |
The JSON example above would produce this menu structure:
📁 Warehouse
📁 Zone A
📄 Picking
📄 Goods Receipt
📄 Inventory
📄 Dashboard
Entries with identical paths are automatically grouped into the same folder. Folders are created implicitly – they do not need to be defined separately.
Security
| Key | Type | Default | Description |
|---|---|---|---|
adminPassword | string | "" | Admin password for settings access |
requirePasswordLaunchpad | bool | false | Require password to switch start pages |
SslUntrustIgnore | bool | false | Allow HTTPS connections with invalid certificates |
flxBlockCopyPaste | bool | false | Block copy & paste from web content |
FlxCertChooser | bool | false | Show certificate selection dialog at login |
FlxUseSmartcard | bool | false | Enable NFC smartcard authentication |
NFCConfig | string | "" | Smartcard configuration (imported via QR) |
User interface
| Key | Type | Default | Description |
|---|---|---|---|
FLXShowStatusBar | bool | true | Show Android status bar |
FLXShowNavigationBar | bool | true | Show Android navigation bar |
FlxToolbarOverlap | bool | true | Toolbar overlays content instead of pushing it down |
FlxShowCloseButton | bool | false | Show close/exit button in toolbar |
FlxKeepScreenOn | bool | false | Prevent screen from turning off |
FlxConnectionStatus | bool | false | Show connection status indicator |
ZoomAmount | string | "100" | Page zoom in percent |
flxSelectedLanguage | string | "" | App language: "" (system), "de_DE", "en_EN" |
Keyboard
| Key | Type | Default | Description |
|---|---|---|---|
FLXSoftInputModeResize | bool | true | Keyboard pushes UI content up (instead of overlaying) |
flxKeyboardPreferences | string | "default" | When keyboard opens: "default", "Active_on_tap", "deactivated" |
Paired device (backhand scanner)
| Key | Type | Default | Description |
|---|---|---|---|
flxPairedDevice | string | "none" | "none", "PROGLOVE_MARK_DISPLAY_SDK", "NIMMSTA_HS50_SDK" |
flxPairedDevice_ScanMode | string | "default" | "default", "onlyBarcodes", "onlyQRCode" |
Cache & cookies
| Key | Type | Default | Description |
|---|---|---|---|
ClearSessions | bool | true | Clear session data on app exit |
ClearCacheOnExit | bool | true | Clear file cache on app exit |
ClearCookieOnSwitchingLaunchpad | bool | true | Clear cookies when switching start pages |
ClearCacheOnSwitchingLaunchpad | bool | true | Clear file cache when switching start pages |
PDF & display
| Key | Type | Default | Description |
|---|---|---|---|
FlxPdfViewerEnabled | bool | true | Open PDF links in the embedded viewer |
FlxProgressIndicator | bool | true | Show loading indicator at the screen edge |
FlxDebugMode | bool | false | Enable extended debug logging |
Logging
| Key | Type | Default | Description |
|---|---|---|---|
LogLevel | string | "ERROR" | "ERROR", "WARNING", "INFO", "DEBUG" |
Custom scripts (customScript_Configuration)
| Key | Type | Description |
|---|---|---|
customScriptDescription | string | Display name |
customScriptName | string | URL pattern the script applies to (e.g. "https://my-system.com*") |
customScriptCode | string | JavaScript code to inject |
customScriptActive | bool | Enable/disable this entry |
Custom CSS (customCSSSet_Configuration)
| Key | Type | Description |
|---|---|---|
customCSSDescription | string | Display name |
customCSSName | string | URL pattern the CSS applies to |
customCSSCode | string | CSS code to inject |
customCSSActive | bool | Enable/disable this entry |
Custom keyboards (customKeyboardSet_Configuration)
| Key | Type | Description |
|---|---|---|
inputType | string | Input type: "default", "text", "password", "number", "email", "tel", "textarea", "custom" |
cKeyboard | string | Keyboard layout as JSON string |
customParameter | string | Optional parameter for "custom" input type |
Scan configuration (scanConfig_Configuration)
| Key | Type | Description |
|---|---|---|
scanConfigName | string | Display name |
scanConfigLengthRule | string | Rule type: "FALLBACK", "EXACT", "AT_MOST", "AT_LEAST", "LENGTH_RANGE", "STARTS_WITH", "ENDS_WITH", "CONTAINS" |
scanConfigMatchLength | integer | Target length (for length-based rules) |
scanConfigMatchLengthMax | integer | Maximum length (for LENGTH_RANGE only) |
scanConfigMatchText | string | Text pattern (for STARTS_WITH, ENDS_WITH, CONTAINS) |
Scan actions (scanConfigActions – nested bundle array):
| Key | Type | Description |
|---|---|---|
scanConfigActionType | string | "CUT_FIRST", "CUT_LAST", "TAKE_FIRST", "TAKE_LAST", "PREFIX", "SUFFIX", "INSERT_AT", "EXTRACT", "REPLACE", "REMOVE_LEADING_ZEROS", "REMOVE_TRAILING_ZEROS", "PAD_LEFT", "PAD_RIGHT", "UPPERCASE", "LOWERCASE" |
scanConfigActionCount | integer | Numeric parameter (character count, position) |
scanConfigActionCount2 | integer | Second numeric parameter (e.g. length for EXTRACT) |
scanConfigActionText | string | Text parameter (prefix/suffix text, search value, pad character) |
scanConfigActionText2 | string | Replacement value (for REPLACE) |




