In this page

Update configurations at runtime

这篇文档目前尚未提供译文,将以原文展示。

This example guides you through the following steps:

  1. Initialization with Customized Configurations: Learn how to set up the SDK with customized configuration values, tailoring it to your specific requirements and preferences.

  2. Updating Configuration Settings at Runtime: Discover how to dynamically modify configuration settings such as LocationConfig, NotificationConfig, and DataTrackingConfig during the execution of your application. This flexibility empowers you to adapt the SDK to changing conditions and user needs in real time.

For all code examples, refer to Asset Tracking Android Code Examples

activity_update_configuration.xml view source

1<?xml version="1.0" encoding="utf-8"?>
2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3   xmlns:app="http://schemas.android.com/apk/res-auto"
4   xmlns:tools="http://schemas.android.com/tools"
5   android:layout_width="match_parent"
6   android:layout_height="match_parent"
7   android:orientation="vertical"
8   android:padding="10dp"
9   tools:context=".codeexample.AssetProfileOperations">
10
11   <Button
12       android:id="@+id/update_location_config"
13       android:layout_width="wrap_content"
14       android:layout_height="wrap_content"
15       android:text="@string/update_location_config" />
16
17   <Button
18       android:id="@+id/update_notification_config"
19       android:layout_width="wrap_content"
20       android:layout_height="wrap_content"
21       android:text="@string/update_notification_config" />
22
23   <Button
24       android:id="@+id/update_data_tracking_config"
25       android:layout_width="wrap_content"
26       android:layout_height="wrap_content"
27       android:text="@string/update_data_tracking_config" />
28
29   <TextView
30       android:id="@+id/configuration_detail"
31       android:layout_width="wrap_content"
32       android:layout_height="wrap_content"
33       android:layout_marginTop="10dp" />
34
35</LinearLayout>

UpdateConfiguration view source

1class UpdateConfiguration : AppCompatActivity() {
2    private lateinit var updateLocationConfigButton: Button
3    private lateinit var updateNotificationConfigButton: Button
4    private lateinit var updateDataTrackingConfigButton: Button
5    private lateinit var configurationDetailView: TextView
6
7    private lateinit var defaultConfig: DefaultConfig
8    private lateinit var locationConfig: LocationConfig
9    private lateinit var notificationConfig: NotificationConfig
10    private lateinit var dataTrackingConfig: DataTrackingConfig
11
12    var permissionsManager: LocationPermissionsManager? = null
13    private var assetId = ""
14
15    override fun onCreate(savedInstanceState: Bundle?) {
16        super.onCreate(savedInstanceState)
17        setContentView(R.layout.activity_update_configuration)
18
19        // initialize the Asset Tracking SDK
20        initConfigurations()
21        createAsset()
22
23        initView()
24    }
25
26    override fun onDestroy() {
27        super.onDestroy()
28        // add this to avoid blocking other example, could remove in real usage
29        assetTrackingStop()
30    }
31
32    @SuppressLint("SetTextI18n")
33    private fun initView() {
34        configurationDetailView = findViewById(R.id.configuration_detail)
35
36        updateLocationConfigButton = findViewById(R.id.update_location_config)
37        updateLocationConfigButton.setOnClickListener {
38            val locationConfigToChange = LocationConfig(
39                interval = 20000,
40                smallestDisplacement = 20.0f,
41                maxWaitTime = 5000,
42                fastestInterval = 1500,
43                enableStationaryCheck = true
44            )
45            assetTrackingUpdateLocationConfig(locationConfigToChange)
46
47            locationConfig = assetTrackingGetLocationConfig()
48
49            configurationDetailView.text = "location config: " + Gson().toJson(locationConfig)
50
51        }
52
53        updateNotificationConfigButton = findViewById(R.id.update_notification_config)
54        updateNotificationConfigButton.setOnClickListener {
55            val notificationConfigToChange = NotificationConfig(
56                channelId = "NextBillion.ai",
57                channelName = "NextBillion.ai",
58            )
59            assetTrackingUpdateNotificationConfig(notificationConfigToChange)
60
61            notificationConfig = assetTrackingGetNotificationConfig()
62
63            configurationDetailView.text = "notification config: " + Gson().toJson(notificationConfig)
64        }
65
66        updateDataTrackingConfigButton = findViewById(R.id.update_data_tracking_config)
67        updateDataTrackingConfigButton.setOnClickListener {
68
69            val dataTrackingConfigToChange = DataTrackingConfig(
70                baseUrl = "https://api.nextbillion.io",
71                dataUploadingBatchSize = 15,
72                dataUploadingBatchWindow = 30,
73                dataStorageSize = 5000,
74                shouldClearLocalDataWhenCollision = false
75            )
76            assetTrackingUpdateDataTrackingConfig(dataTrackingConfigToChange)
77
78            dataTrackingConfig = assetTrackingGetDataTrackingConfig()
79            configurationDetailView.text = "dataTracking config: " + Gson().toJson(dataTrackingConfig)
80        }
81    }
82
83
84    private fun initConfigurations() {
85        defaultConfig = DefaultConfig(
86            debug = false,
87            enhanceService = true,
88            repeatInterval = 5L,
89            workerEnabled = true,
90            crashRestartEnabled = true,
91            workOnMainThread = true,
92            restartIntent = null
93        )
94
95        // You can either choose the specified tracking mode, or use self-defined
96        locationConfig = LocationConfig(
97            trackingMode = TrackingMode.ACTIVE,
98            maxWaitTime = 10000,
99            fastestInterval = 1000,
100            enableStationaryCheck = false
101        )
102
103        notificationConfig = NotificationConfig(channelId = "Custom.ID", channelName = "Custom.Name")
104
105        dataTrackingConfig = DataTrackingConfig(
106            baseUrl = "https://api.nextbillion.io",
107            dataUploadingBatchSize = 30,
108            dataUploadingBatchWindow = 20,
109            dataStorageSize = 5000,
110            shouldClearLocalDataWhenCollision = true
111        )
112
113        AssetTracking {
114            setDefaultConfig(defaultConfig)
115            setLocationConfig(locationConfig)
116            setNotificationConfig(notificationConfig)
117            setDataTrackingConfig(dataTrackingConfig)
118        }
119
120         initialize("PUT YOUR API KEY HERE")
121    }
122
123    private fun createAsset() {
124        val assetAttributes: Map<String, String> = mapOf("attribute 1" to "test 1", "attribute 2" to "test 2")
125        val assetProfile = AssetProfile.Builder().setCustomId(UUID.randomUUID().toString()).setName("testName")
126            .setDescription("testDescription").setAttributes(assetAttributes).build()
127
128        createNewAsset(assetProfile, object : AssetApiCallback<AssetCreationResponse> {
129            @SuppressLint("SetTextI18n")
130            override fun onSuccess(result: AssetCreationResponse) {
131                assetId = result.data.id
132                Toast.makeText(
133                    this@UpdateConfiguration,
134                    "create asset successfully with asset id: $assetId",
135                    Toast.LENGTH_LONG
136                ).show()
137                bindAssetAndStartTracking()
138            }
139
140            override fun onFailure(exception: Exception) {
141                Toast.makeText(
142                    this@UpdateConfiguration,
143                    "create asset failed with error: " + exception.message,
144                    Toast.LENGTH_LONG
145                ).show()
146            }
147        })
148    }
149
150    private fun bindAssetAndStartTracking() {
151        bindAsset(assetId, object : AssetApiCallback<Unit> {
152            @SuppressLint("SetTextI18n")
153            override fun onSuccess(result: Unit) {
154                Toast.makeText(
155                    this@UpdateConfiguration,
156                    String.format(
157                        "bind asset successfully with assetId: %s",
158                        assetId
159                    ),
160                    Toast.LENGTH_LONG
161                ).show()
162                checkPermissionsAndStartTracking()
163            }
164
165            override fun onFailure(exception: Exception) {
166                val exceptionMessage = exception.message ?: ""
167                Toast.makeText(
168                    this@UpdateConfiguration,
169                    "bind asset failed: $exceptionMessage",
170                    Toast.LENGTH_LONG
171                ).show()
172            }
173        })
174    }
175
176    private fun checkPermissionsAndStartTracking() {
177        if (LocationPermissionsManager.areAllLocationPermissionGranted(this)) {
178            startTracking()
179        } else if (!LocationPermissionsManager.isLocationServiceEnabled(this)) {
180            showLocationServiceOffDialog()
181        } else {
182            permissionsManager = LocationPermissionsManager(object : LocationPermissionsListener {
183                override fun onExplanationNeeded(permissionsToExplain: List<String>?) {
184                    Toast.makeText(
185                        this@UpdateConfiguration, "You need to accept location permissions.",
186                        Toast.LENGTH_SHORT
187                    ).show()
188                }
189
190                override fun onPermissionResult(granted: Boolean) {
191                    if (granted) {
192                        if (LocationPermissionsManager.isBackgroundLocationPermissionGranted(this@UpdateConfiguration)) {
193                            startTracking()
194                        } else {
195                            permissionsManager?.requestBackgroundLocationPermissions(this@UpdateConfiguration)
196                        }
197                    } else {
198                        Toast.makeText(
199                            this@UpdateConfiguration, "You need to accept location permissions.$granted",
200                            Toast.LENGTH_SHORT
201                        ).show()
202                    }
203                }
204            })
205            permissionsManager?.requestLocationPermissions(this)
206        }
207    }
208
209    @SuppressLint("MissingPermission", "SetTextI18n")
210    fun startTracking() {
211        assetTrackingStart()
212    }
213
214    private fun showLocationServiceOffDialog() {
215        val alertDialogBuilder = AlertDialog.Builder(this)
216
217        alertDialogBuilder.setTitle("Location Services Disabled")
218        alertDialogBuilder.setMessage("To enable location services, please go to Settings > Privacy > Location Services.")
219
220        alertDialogBuilder.setPositiveButton("OK") { dialogInterface: DialogInterface, _: Int ->
221            dialogInterface.dismiss() // Close the dialog
222        }
223
224        val alertDialog = alertDialogBuilder.create()
225        alertDialog.show()
226    }
227
228}

Upon executing the code example provided above, your app's appearance will resemble the following snippet:

Code Highlights

The above code snippet is for an Android activity that demonstrates how to update the configuration of the Asset Tracking SDK. The activity has the following main steps:

  1. Initialize the Asset Tracking SDK.

  2. Create an asset profile.

  3. Bind the asset profile to the device.

  4. Start tracking the asset.

  5. Update the configuration of the Asset Tracking SDK.

The following is a description of each step:

  1. To initialize the Asset Tracking SDK, the activity calls the initialize() method with the API key.

  2. To create an asset profile, the activity creates an AssetProfile object and sets its properties. The AssetProfile object specifies the asset's custom ID, name, description, and attributes.

  3. To bind the asset profile to the device, the activity calls the bindAsset() method with the asset ID.

  4. To start tracking the asset, the activity calls the assetTrackingStart() method.

  5. To update the configuration of the Asset Tracking SDK, the activity calls the following methods:

    1. assetTrackingUpdateLocationConfig(): This method updates the location configuration.

    2. assetTrackingUpdateNotificationConfig(): This method updates the notification configuration.

    3. assetTrackingUpdateDataTrackingConfig(): This method updates the data tracking configuration.

The activity also includes a few helper functions:

  1. initConfigurations(): This function initializes the default configuration, location configuration, notification configuration, and data tracking configuration.

  2. createAsset(): This function creates an asset profile and binds it to the device.

  3. bindAssetAndStartTracking(): This function binds an asset profile to the device and starts tracking the asset.

  4. checkPermissionsAndStartTracking(): This function checks for location permissions and starts tracking the asset if they are granted.

  5. showLocationServiceOffDialog(): This function shows a dialog to the user if location services are disabled.

没找到你要找的内容?