Skip to main content

From Remote URL

PhotoEditor SDK supports loading stickers from a remote URL, this can be a resource hosted by a hosting provider or your servers.

Although the editor supports adding assets with remote URLs, we highly recommend that you manage the download of remote resources yourself, since this gives you more control over the whole process. In this example, we add a custom sticker by directly passing the remote URLs in the configuration. For an example of how to download the remote resources in advance see the font example.

Custom sticker asset#

Here, we create a custom sticker using ImageStickerAsset. It takes in a unique identifier (used for serialization/deserialization purposes), and the sticker's ImageSource.

Add sticker to AssetConfig#

To use the sticker, it must first be available in the SDK's backend. This is done by adding the sticker to the AssetConfig.

Create a custom sticker category#

We then add the stickers to a StickerCategoryItem and provide it with an id, name, and thumbnail ImageSource.

Configure UiConfigSticker#

Here, we configure UiConfigSticker and add the custom sticker category as the first item in the list.

class PhotoAddStickersFromRemoteURL(private val activity: AppCompatActivity) : Example(activity) {
override fun invoke() {
// In this example, we do not need access to the Uri(s) after the editor is closed
// so we pass false in the constructor
val settingsList = PhotoEditorSettingsList(false)
// Set the source as the Uri of the image to be loaded
.configure<LoadSettings> {
it.source = activity.resourceUri(
// Create a custom sticker
val customSticker = ImageStickerAsset(
val existingSticker = ImageStickerAsset(
// Add custom sticker to AssetConfig
// Create custom sticker category
val customStickerCategory = StickerCategoryItem(
settingsList.configure<UiConfigSticker> {
// Add custom sticker category to the UI
it.stickerLists.add(0, customStickerCategory)
// Start the photo editor using PhotoEditorBuilder
// The result will be obtained in onActivityResult() corresponding to EDITOR_REQUEST_CODE
.startActivityForResult(activity, EDITOR_REQUEST_CODE)
// Release the SettingsList once done
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
intent ?: return
if (requestCode == EDITOR_REQUEST_CODE) {
// Wrap the intent into an EditorSDKResult
val result = EditorSDKResult(intent)
when (result.resultStatus) {
EditorSDKResult.Status.CANCELED -> showMessage("Editor cancelled")
EditorSDKResult.Status.EXPORT_DONE -> showMessage("Result saved at ${result.resultUri}")
else -> {