{"templateId":"markdown","versions":[{"version":"v1","label":"v1 (Latest)","link":"/products/sca-exemptions/device-data/android","default":true,"active":true,"folderId":"edc06d3d"}],"sharedDataIds":{"sidebar":"sidebar-products/sca-exemptions/sidebars.yaml","current-catalog-info":"current-catalog-info-/products/sca-exemptions/openapi"},"props":{"metadata":{"markdoc":{"tagList":["partial","admonition","tabs","tab"]},"custom_product":"SCA Exemptions","type":"markdown"},"seo":{"title":"Android device data","description":"Worldpay for Developers - docs, code examples, resources and tools. Everything you need to build your omnichannel payment solution.","siteUrl":"https://docs.worldpay.com/access","image":"/access/assets/worldpay-logo-light.21b7daf79984773a9fcd7d4fbcb07ae5289dfffd6023c4c3dca720c7058e53dc.33f780a6.svg","keywords":"documentation, api, openapi, sdks, developer, payments, json, payouts, 3ds","jsonLd":{"@context":"https://schema.org","@type":"Organization","url":"https://docs.worldpay.com/access","name":"Worldpay"},"meta":[{"name":"google-site-verification","content":"zjziIKaP3ImsqsfhYnEBnq1R85UabiSwl7HTXuwtZuo"},{"name":"doc_product","content":"Access"},{"name":"doc_category","content":"Documentation"}],"llmstxt":{"hide":false,"sections":[{"title":"Payments API","description":"Payment orchestration API combining fraud assessment, 3ds authentication, SCA exemptions, Worldpay Token creation and a card or wallet based payment.","includeFiles":["products/payments/@20240601/**/*"],"excludeFiles":[]},{"title":"Payment Queries API","description":"Querying your payments data, based on a variety of parameters.","includeFiles":["products/payment-queries/@v1/**/*"],"excludeFiles":[]},{"title":"Card BIN Data API","description":"Provides detailed information about a card.","includeFiles":["products/card-bin/@v1/**/*"],"excludeFiles":[]},{"title":"3DS Authentication API","description":"Request 3DS authentication to protect against fraud, be SCA compliant and to shift liability using this standalone API.","includeFiles":["products/3ds/@v3/**/*"],"excludeFiles":[]},{"title":"FraudSight API","description":"Request a risk assessment and receive a response with an outcome (e.g. lowRisk) using this standalone API.","includeFiles":["products/fraudsight/@v1/**/*"],"excludeFiles":[]},{"title":"Checkout SDK","description":"Integrate using our clientside SDKs for both web and native devices. Benefit from SAQ-A/PCI-SSF compliance.","includeFiles":["products/checkout/web/@v2/**/*","products/checkout/ios/@v4/**/*","products/checkout/android/@v4/**/*","products/checkout/react-native/@v3/**/*","products/checkout/flutter/@v1/**/*"],"excludeFiles":[]},{"title":"Tokens API","description":"Minimizes the exposure of sensitive card details and increases the security of your customer's card details.","includeFiles":["products/tokens/@v3/**/*"],"excludeFiles":[]},{"title":"Card Payments API","description":"Request a card payment using this standalone API, requires separate requests for 3DS, Fraud assessment etc.","includeFiles":["products/card-payments/@v7/**/*"],"excludeFiles":[]},{"title":"Card Verifications API","description":"Verify your customer's card to maximize your authentication rates.","includeFiles":["products/card-verifications/@v6/**/*"],"excludeFiles":[]},{"title":"Account Payouts API","description":"Send funds to your customer's bank accounts and search for payouts using parameters.","includeFiles":["products/account-payouts/@20250101/**/*"],"excludeFiles":[]},{"title":"APMs","description":"Pay using eWallets, bank transfers, direct debits, local card schemes, Postpay and eInvoice/ Buy Now Pay Later.","includeFiles":["products/apms/@20240701/**/*"],"excludeFiles":[]},{"title":"Balance API","description":"Request your account details for a single account or all accounts under an entity.","includeFiles":["products/balance/@20250101/**/*"],"excludeFiles":[]},{"title":"Card Payouts API","description":"Send funds to your customer's cards.","includeFiles":["products/card-payouts/@v4/**/*"],"excludeFiles":[]},{"title":"Events (Webhooks)","description":"Receive status updates from Access Worldpay by setting up a webhook.","includeFiles":["products/events/@v1/**/*"],"excludeFiles":[]},{"title":"FX API","description":"Manage Foreign Exchange (FX) on your payments.","includeFiles":["products/fx/@v1/**/*"],"excludeFiles":[]},{"title":"Hosted Payment Pages (HPP) API","description":"Our low-code option to take payments securely at the lowest PCI compliance level - SAQ A.","includeFiles":["products/hosted-payment-pages/@v1/**/*"],"excludeFiles":[]},{"title":"Money Transfers API","description":"Money Transfer OCTs (Original Credit Transaction) allow funds to be pushed to an eligible card in 30 minutes or less.","includeFiles":["products/money-transfers/@v1/**/*"],"excludeFiles":[]},{"title":"Parties API","description":"Create parties, manage your payout instruments and beneficial owners and carry out identity verification checks.","includeFiles":["products/parties/@20250101/**/*"],"excludeFiles":[]},{"title":"SCA Exemptions API","description":"Maximize a frictionless checkout experience by using issuer data insights to apply exemptions.","includeFiles":["products/sca-exemptions/@v1/**/*"],"excludeFiles":[]},{"title":"Split Payments API","description":"Divide funds from a single payment amongst yourself and your parties/sellers.","includeFiles":["products/split-payments/@20250625/**/*"],"excludeFiles":[]},{"title":"Statements API","description":"Retrieve your account statement and see individual entries for all credits and debits.","includeFiles":["products/statements/@20250101/**/*"],"excludeFiles":[]},{"title":"Transfers API","description":"Transfer funds from source account to target account.","includeFiles":["products/transfers/@20250101/**/*"],"excludeFiles":[]},{"title":"Verified Tokens API","description":"Verified Tokens ensures that your customer's payment details are valid and CIT compliant when creating a token.","includeFiles":["products/verified-tokens/@v3/**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Last updated"]},": 30 September 2024 | ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/sca-exemptions/changelog/"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Change log"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"android-device-data","__idx":0},"children":["Android device data"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When combined with order and transaction details, device data (IP Address, Device Id, Geolocation Information, etc.) can be a strong indicator for fraud or used via GeoIP lookup to create manual rules based on location. Utilizing device data with Access Exemptions is a two-step process. Step one is to collect the device data. Step two is to submit an ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/sca-exemptions/assessment"},"children":["assessment"]}," that will use the device data for evaluation. Described below is step one for Android."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"threatmetrix-android-sdk","__idx":1},"children":["ThreatMetrix Android SDK"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ThreatMetrix Android SDK provides mobile application developers with Android specific libraries. It leverages the ThreatMetrix Platform to detect fraud and security vulnerabilities originating from mobile devices in real-time."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The instructions are applicable to ThreatMetrix SDK version ",{"$$mdtype":"Tag","name":"b","attributes":{},"children":["V6-2"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"overview-of-implementation","__idx":2},"children":["Overview of implementation"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Include the ThreatMetrix SDK in the application."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Call the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["init()"]}," method to initialize the SDK."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Call the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["profile()"]}," method to begin device profiling. ThreatMetrix SDK will transmit the collected attributes and a unique sessionId to the ThreatMetrix Platform."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Apply the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sessionId"]}," in the Exemption assessment request so it forms part of the risk assessment."]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-to-get-the-sdk","__idx":3},"children":["How to get the SDK"]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Note"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This will be released shortly, this documentation is for preview only"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"modules-to-include","__idx":4},"children":["Modules to include"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["TMXProfiling:"]}," This module is responsible for performing profiling exclusively. It does not transfer anything over the network, so the module does not send or receive data on its own. You must pair this module with TMXProfilingConnections module or a custom profiling connections module to send and receive data to and from the backend for successful profiling."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["TMXProfilingConnections:"]}," It is the default networking module provided by ThreatMetrix. This module only transfers data over the network without changing the data."]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Include AAR files of TMXProfiling and TMXProfilingConnections modules into your ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["app/libs"]}," folder. Then add these dependencies into your app-level ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["build.gradle"]}," file."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"implementation files('libs/TMXProfiling-6.2-107.aar')\nimplementation files('libs/TMXProfilingConnections-6.2-107.aar')\n"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"permissions","__idx":5},"children":["Permissions"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"mandatory-permissions","__idx":6},"children":["Mandatory permissions"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You must include the following permission in the manifest file of your application."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"<uses-permission android:name=\"android.permission.INTERNET\" \\/>\n"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"optional-permissions","__idx":7},"children":["Optional permissions"]},{"$$mdtype":"Tag","name":"details","attributes":{},"children":[{"$$mdtype":"Tag","name":"summary","attributes":{},"children":["Add these optional permissions in the application manifest file for better profiling."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Note"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["These permissions will display a popup on the end user's mobile for granting access."]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/\\>\n\n<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/\\>  \n\n<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/\\>\n\n<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/\\>\n\n<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/\\>\n"},"children":[]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"using-threatmetrix-sdk","__idx":8},"children":["Using ThreatMetrix SDK"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"profiling","__idx":9},"children":["Profiling"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Profiling is a mechanism by which ThreatMetrix collects information about the device that is accessing a customer's online service, either via a website or a native application."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Identify the screen in your native application that provides the optimal opportunity for profiling. The majority of profiling is completed in a short span and may take up to 5 seconds to collect the full set of profiling attributes."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Common screens where we can initiate profiling are Account creation screen, Payments screen and Login screen."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"details-required","__idx":10},"children":["Details required"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To create a config instance, pass the below details to the init() method."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Placeholder"},"children":["Placeholder"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ORG_ID"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["For testing use: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["afevfjm6"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["For live use: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["dzppsd1h"]}]}]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FP_SERVER"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["For testing use: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ddc-test.worldpay.com"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["For live use: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ddc.worldpay.com"]}]}]}]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"get-instance-and-initialize","__idx":11},"children":["Get instance and initialize"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ThreatMetrix SDK is initialized asynchronously at startup by calling the init() function which is configured with the Config object."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You must at least specify ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Context"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Org ID"]}," and the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FP server/Profiling domain"]},". The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["getInstance()"]}," method of TMXProfiling class is used to return a singleton instance of the ThreatMetrix Object. The instance is only required to be initialized once."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Here’s an example of how you can get instance and initialize for profiling."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"Kotlin","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"\nclass MainActivity : AppCompatActivity() {\n\noverride fun onCreate(savedInstanceState: Bundle?) {\n  super.onCreate(savedInstanceState)\n\n  val username: EditText = findViewById(R.id.editTextUsername)\n  val password: EditText = findViewById(R.id.editTextPassword)\n\n /* Creating a config instance to be passed to the init() method. This instance must  \n  include orgId and application context otherwise the init()method will fail. */\n\n  var config = TMXConfig()\n \t//(REQUIRED) Organization ID\n                   .setOrgId(ORG_ID)\n\t// (REQUIRED) FPserver/Profiling domain\n    \t\t    .setFPServer(FP_SERVER)\n\t// (REQUIRED) Application Context\n    \t\t   .setContext(applicationContext)\n  // (Optional) Register for location services\n\t// Requires ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION permission\t\t            \n          .setRegisterForLocationServices(true)\n\n\n  /*Getting instance of ThreatMatrix object by passing config object to it*/\n  TMXProfiling.getInstance().init(config)\n  /*Once the valid instance is created for further calls, fire a profile\n   request*/\n  doProfile()\n }\n}\n"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Java","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"public class LoginActivity extends Activity\n{\n    private EditText    username;\n    private EditText    password;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState)\n    {\n        username   = findViewById(R.id.editTextUsername);\n        password  = findViewById(R.id.editTextPassword);\n /* Creating a config instance to be passed to the init() method. This instance\n  must include orgId and application context otherwise the init() method will   \n  fail. */\n    TMXConfig config = new TMXConfig()\n       //(REQUIRED) Organization ID\n            .setOrgId(ORG_ID)\n       // (REQUIRED) FPserver/Profiling domain\n            .setFPServer(FP_SERVER)\n       // (REQUIRED) Application Context\n            .setContext(getApplicationContext())\n       // (Optional) Register for location services\n\t// Requires ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION permission\n\t      .setRegisterForLocationServices(true);\n\n /*Getting instance of ThreatMatrix object by passing config object to it*/\n        TMXProfiling.getInstance().init(config);\n /*Once the valid instance is created , call your code which starts profiling */\n        doProfile();\n    }\n}\n\n"},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"start-profiling","__idx":12},"children":["Start profiling"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create a method to start profiling and send some additional attributes along with profiling information. Here’s a code sample of a method that starts profiling."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"Kotlin","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"fun doProfile(){\n\n  /*(OPTIONAL) Assign some custom attributes to be included along with the  \n   profiling Information*/\n    val list = listOf(\"attribute 1\", \"attribute 2\")\n\n    var options: TMXProfilingOptions = TMXProfilingOptions()\n        \t\t.setCustomAttributes(list)\n   //Start the profiling request\n   /*The instance of TMXEndNotifier must be passed to the profile() method, the   \n     CompletionNotifier is an implementation of TMXEndNotifier which is explained\n     in obtaining profiling result section*/\n     TMXProfiling.getInstance()\n                 .profile(options, CompletionNotifier())\n\n }\n\n"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Java","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"void doProfile()\n{\n  /*(OPTIONAL) Assign some custom attributes to be included along with the  \n   profiling Information*/\n   List<String> list = Arrays.asList(\"attribute 1\", \"attribute 2\");\n\n    TMXProfilingOptions options = new TMXProfilingOptions().setCustomAttributes(list);\n   //Start the profiling request\n   /*The instance of TMXEndNotifier must be passed to the profile() method, the   \n     CompletionNotifier is an implementation of TMXEndNotifier which is explained\n     in obtaining profiling result section*/\n    TMXProfiling.getInstance()\n                .profile(options,new CompletionNotifier());\n}\n"},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"obtaining-profiling-result-and-sessionid","__idx":13},"children":["Obtaining profiling result and sessionID"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create a class which implements the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TMXEndNotifier"]}," interface."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Implement the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["complete()"]}," method."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Pass an instance of that class as part of the call to the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["profile()"]},"  method as shown above."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["complete()"]}," method of that instance will be called with the result of the profiling once profiling has finished."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result.status/ result.getStatus()"]}," method to know the status of profiling. This method returns string “Okay” on successful profiling."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Here's an example of the implementation."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"Kotlin","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"/* TMXEndNotifier implementation called when profiling is completed */\n\nclass CompletionNotifier: TMXEndNotifier {\n\n  /*This method gets called when the profiling has finished. Be careful here    \n    because we are not going to be called on the UI thread, and if we want to\n    update UI elements we can only do it from the UI thread.*/\n\n     override fun complete(result: TMXProfilingHandle.Result) {\n\n\t //Get the session id to use in API call (AKA session query)\n\t val sessionID = result.sessionID\n         val status = result.status\n\n    }\n}\n"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Java","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"/* TMXEndNotifier implementation called when profiling is completed */\n\nprivate class CompletionNotifier implements TMXEndNotifier\n{\n\n    private String sessionID;\n\n  /*This method gets called when the profiling has finished. Be careful here    \n    because we are not going to be called on the UI thread, and if we want to\n    update UI elements we can only do it from the UI thread.*/\n\n    @Override\n    public void complete(TMXProfilingHandle.Result result)\n    {\n\t//Get the session id to use in API call (AKA session query)\n        sessionID = result.getSessionID();\n        result = result.getStatus();\n\n    }\n}\n"},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"linking-the-device-data-with-the-assessment","__idx":14},"children":["Linking the device data with the assessment"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When sending the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/sca-exemptions/assessment"},"children":["Exemption assessment"]}," request, include the sessionId in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["deviceData.collectionReference"]},"."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Next steps"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/sca-exemptions/assessment"},"children":["Assessment"]}]}]},"headings":[{"value":"Android device data","id":"android-device-data","depth":1},{"value":"ThreatMetrix Android SDK","id":"threatmetrix-android-sdk","depth":2},{"value":"Overview of implementation","id":"overview-of-implementation","depth":3},{"value":"How to get the SDK","id":"how-to-get-the-sdk","depth":2},{"value":"Modules to include","id":"modules-to-include","depth":3},{"value":"Permissions","id":"permissions","depth":2},{"value":"Mandatory permissions","id":"mandatory-permissions","depth":4},{"value":"Optional permissions","id":"optional-permissions","depth":4},{"value":"Using ThreatMetrix SDK","id":"using-threatmetrix-sdk","depth":2},{"value":"Profiling","id":"profiling","depth":3},{"value":"Details required","id":"details-required","depth":3},{"value":"Get instance and initialize","id":"get-instance-and-initialize","depth":3},{"value":"Start profiling","id":"start-profiling","depth":3},{"value":"Obtaining profiling result and sessionID","id":"obtaining-profiling-result-and-sessionid","depth":3},{"value":"Linking the device data with the assessment","id":"linking-the-device-data-with-the-assessment","depth":2}],"frontmatter":{"seo":{"title":"Android device data"}},"lastModified":"2025-11-26T14:54:42.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/products/sca-exemptions/device-data/android","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}