Android SDK

Native Kotlin SDK for creating blockchain-verified .facti files on Android

Installation

Gradle

Add to your build.gradle:

dependencies {
    implementation 'io.blockfact:sdk:2.0.0'
}

Quick Start

import io.blockfact.sdk.BlockFact

val blockFact = BlockFact(context)

// Create wallet
val wallet = blockFact.createWallet()
println("Wallet: ${wallet.address}")

// Register content
val result = blockFact.registerContent(
    image = bitmap,
    latitude = location.latitude,
    longitude = location.longitude
)

println("Registered: ${result.factiUrl}")

API Reference

BlockFact

createWallet()

suspend fun createWallet(): Wallet

Creates a new Starknet wallet. Stored securely in EncryptedSharedPreferences.

getWallet()

fun getWallet(): Wallet?

Retrieves existing wallet.

registerContent()

suspend fun registerContent(
    image: Bitmap,
    latitude: Double,
    longitude: Double,
    metadata: Map<String, Any> = emptyMap()
): RegistrationResult

Registers content on blockchain and returns .facti URL.

verifyContent()

suspend fun verifyContent(factiUrl: String): VerificationResult

Verifies a .facti file against blockchain.

Complete Example

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.lifecycle.lifecycleScope
import io.blockfact.sdk.BlockFact
import kotlinx.coroutines.launch

class CameraActivity : ComponentActivity() {
    
    private lateinit var blockFact: BlockFact
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        blockFact = BlockFact(this)
        
        lifecycleScope.launch {
            if (blockFact.getWallet() == null) {
                blockFact.createWallet()
            }
        }
    }
    
    private fun registerPhoto(bitmap: Bitmap, location: Location) {
        lifecycleScope.launch {
            try {
                val result = blockFact.registerContent(
                    image = bitmap,
                    latitude = location.latitude,
                    longitude = location.longitude
                )
                
                Toast.makeText(
                    this@CameraActivity,
                    "✅ Registered: ${result.txHash}",
                    Toast.LENGTH_LONG
                ).show()
                
            } catch (e: Exception) {
                Toast.makeText(
                    this@CameraActivity,
                    "Error: ${e.message}",
                    Toast.LENGTH_LONG
                ).show()
            }
        }
    }
}

Models

Wallet

data class Wallet(
    val address: String,
    val publicKey: String,
    val privateKey: String
)

RegistrationResult

data class RegistrationResult(
    val factiUrl: String,
    val factiCid: String,
    val txHash: String,
    val sessionId: String
)

VerificationResult

data class VerificationResult(
    val valid: Boolean,
    val metadata: Map<String, Any>,
    val blockNumber: Int,
    val timestamp: String
)

Permissions

Add to AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Requirements

  • • Android 5.0+ (API 21+)
  • • Kotlin 1.8+
  • • AndroidX

ProGuard

If using ProGuard, add:

-keep class io.blockfact.sdk.** { *; }
-keepclassmembers class io.blockfact.sdk.** { *; }

🎉 100% Free to Use

No API keys, no usage limits, no fees. Free to use for any purpose.