本文介绍了如何使用Helius Mint API构建一个NFT铸造的Android应用程序,用户可以轻松捕捉图像并在Solana上铸造压缩NFT。文章详细讲解了应用的搭建、Mint逻辑的实现以及如何与之前的功能交互,适合具备基本Android和Solana知识的开发者阅读。
5分钟阅读
2024年3月19日
本教程介绍如何构建一个NFT(非同质化代币)铸造Android应用程序。目的是让用户轻松捕捉图像并在Solana上铸造压缩的NFT。为实现此目的,我们将使用Helius Mint API。这个API加速了压缩NFT的铸造,并减少了模板代码,为你节省了大量时间和计划。我们的Android应用程序将采用Kotlin和Jetpack Compose进行开发。
压缩NFT(cNFTs)使用状态压缩和并发Merkle树来降低存储成本。压缩的NFT比其未压缩的对应物便宜2400到24000倍,同时仍然保留相同的结构。
在深入本教程之前,你应该对使用Kotlin进行Android开发有基本的了解,并且对Solana有一定的熟悉度。
要使用Helius Mint API,你需要一个API密钥。以下是获取API密钥的步骤:
我们为该项目准备了一个起始代码包。
要开始,请按照以下步骤操作:
在将代码下载到本地后,请继续以下操作:
浏览起始应用以熟悉其功能。注意集成到应用中的钱包连接按钮。这使你可以连接任何移动钱包适配器(MWA)兼容的钱包应用。移动钱包适配器(MWA)是连接移动dApp与移动钱包应用的协议规范,支持Solana交易和消息签署的通信。移动钱包适配器支持这些钱包。此外,你还会发现“拍照”按钮,目前允许你捕捉图片。
要在代码库中安全存储Helius API密钥,请导航至local.properties文件并添加API密钥。此文件专门用于包含敏感信息,并被Git忽略,确保你的API密钥的机密性。
api_key=<你的-api-key>
接下来,我们将深入编码逻辑,以将捕获的图像作为压缩NFT(cNFT)进行铸造。
我们的目标是将“拍照”按钮与相机功能集成。集成这个按钮将允许用户捕捉图像并将其铸造为NFT。我们提供了一个启动代码来打开相机并捕捉图像。现在,我们的重点是创建一个函数来管理铸造过程。
此方法铸造一个压缩的NFT。执行时,它将暂停,直到交易被确认,这在网络活动高峰期可能需要长达60秒的时间。请访问文档了解更多。
首先,导航至java/com/example/hmint/MainViewModel.kt
,并在MainViewModel类中创建mintCNft
函数:
代码
@HiltViewModel
class MainViewModel @Inject constructor(
private val walletAdapter: MobileWalletAdapter,
private val walletConnectionUseCase: WalletConnectionUseCase,
) : ViewModel() {
// ...
fun mintCNft(imageUri: Uri, nftName: String, user: String) =
viewModelScope.launch {
_state.update {
_state.value.copy(
isLoading = true,
)
}
}
}
我们将启动一个协程来处理此函数中的铸造逻辑。最初,我们将检索API密钥,定义所需的变量和requestBody
。稍后,你可以根据需要自定义requestBody,以包含其他属性和数据:
代码
withContext(viewModelScope.coroutineContext + Dispatchers.IO) {
val apiKey = System.getProperty("api_key") ?: ""
val url = URL("https://mainnet.helius-rpc.com/?api-key=$apiKey")
val mediaType = "application/json".toMediaTypeOrNull()
val requestBody = """
{
"jsonrpc": "2.0",
"id": "helius-test",
"method": "mintCompressedNft",
"params": {
"name": "$nftName",
"symbol": "HM",
"owner": "$user",
"description": "这是一个通过hMint应用铸造的测试cNFT",
"attributes": [\
{\
"trait_type": "hMint",\
"value": "1"\
}\
],
"imageUrl": "$imageUri",
"sellerFeeBasisPoints": 6900
}
}
""${'"'}.trimIndent()
}
然后,我们将构建请求并初始化一个OkHttpClient
:
代码
val body = requestBody.toRequestBody(mediaType)
val request = Request.Builder()
.url(url)
.post(body)
.addHeader("accept", "application/json")
.addHeader("content-type", "application/json")
.build()
val client = OkHttpClient()
在调用客户端之前,让我们在数据类中定义响应。创建一个名为data
的新包,并在其中新建一个文件NFTResponse.kt
来定义从API调用中接收到的响应的结构。
代码
package com.example.hmint.data
data class NftMintResponse(
val jsonrpc: String,
val id: String,
val result: MintResult
)
data class MintResult(
val signature: String,
val minted: Boolean,
val assetId: String
)
然后,在MainViewModel
类中,增加WalletViewState
数据类的一个附加值mintResponse
。我们将在接收到响应时更新此值:
代码
data class WalletViewState(
// ...
val mintResponse: String = ""
)
回到mintCNft
函数中,利用客户端,我们将执行请求,并相应地处理任何失败或响应。在收到响应后,我们将使用Gson
将数据解析为之前创建的NFTMintResponse
数据类,并相应更新mintResponse
的值:
代码
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
// 处理失败
e.printStackTrace()
Log.d(TAG, "NFT铸造失败")
_state.update {
_state.value.copy(
isLoading = false,
mintResponse = "铸造失败"
)
}
}
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful) {
val responseBody = response.body?.string() ?: ""
val gson = Gson()
val nft = gson.fromJson(responseBody, NftMintResponse::class.java)
Log.d(TAG, "NFT铸造成功: $nft")
_state.update {
_state.value.copy(
isLoading = false,
mintResponse = "铸造成功"
)
}
} else {
// 处理非成功响应
Log.d(TAG, "NFT铸造失败: ${response.code}")
_state.update {
_state.value.copy(
isLoading = false,
mintResponse = "铸造失败"
)
}
}
}
})
在我们的UI中,我们希望向用户提供有关铸造功能结果的反馈。因此,请导航至java/com/example/hmint/composables/MintButton.kt
,其中包含了具有图像捕捉的UI代码和逻辑的可组合函数。在MintButton
中,在哪里声明cameraLauncher
时,我们将调用我们的mintCNft
函数。此外,包含代码以在更新mintResponse
时显示Toast。
代码
@Composable
fun MintButton(
mainViewModel: MainViewModel = hiltViewModel()
) {
val cameraLauncher =
rememberLauncherForActivityResult(ActivityResultContracts.TakePicture()) {
// ...
mainViewModel.mintCNft(uri, "hMint", viewState.userAddress)
}
viewState.mintResponse.let { message ->
if(message.isNotEmpty()){
Toast.makeText(LocalContext.current, message, Toast.LENGTH_SHORT).show()
}
}
// ...
}
我们已经完成了编码阶段,因此让我们运行应用程序。首先连接你的钱包,然后捕捉图像,看看应用程序是如何无缝铸造NFT的。
干得好!你已经成功开发了一个Android应用程序,能够让用户铸造压缩的NFT。多亏了Helius Mint API,铸造cNFT变得从未如此简单,仅需一次调用即可。
还有很多东西可以探索和增强这个应用。一个这样的增强就是集成DAS API。数字资产标准(DAS)API是一个开源规范和系统,提供与数字资产,包括代币和NFT的统一接口。它支持各种资产类型,包括同质化代币、标准NFT和压缩NFT。使用该API,你可以获取所有铸造的压缩NFT,并在你的应用程序中展示它们,为用户提供他们数字资产的全面概览。
要加深你在Jetpack Compose的Android开发、Solana区块链集成和API交互方面的专业知识,可以深入研究以下资源:
如果你需要任何帮助或支持,请随时通过Discord联系我们。完整的代码库可以在GitHub上找到,以便进一步参考。
- 原文链接: helius.dev/blog/build-a-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!