为何无法读取Assets文件夹文件?Web3j WalletUtils加载失败求助
Android中使用Web3j WalletUtils加载Assets目录下钱包文件失败的解决方案
我刚碰到过完全一样的问题!你遇到的核心问题是Android Assets目录下的文件并不存在于设备的常规文件系统路径中,而WalletUtils.loadCredentials()方法的字符串路径/File参数是针对设备本地文件系统的,所以不管你传字符串路径还是File对象,都会找不到APK包内的Assets文件。
问题重现
你调用的代码:
currentWallet = WalletUtils.loadCredentials(password , "/some.json");
抛出的关键错误:
E/Main Activity: onCreate: java.io.FileNotFoundException: keystore.json (No such file or directory)
正确的解决方案
我们需要先通过Android的AssetManager获取Assets文件的输入流,再手动解析为WalletFile对象,最后生成Credentials。具体步骤如下:
- 获取AssetManager实例(在Activity或Fragment中):
AssetManager assetManager = getAssets();
- 打开Assets中钱包文件的输入流:
InputStream inputStream = assetManager.open("keystore.json"); // 这里填Assets里的文件名,不需要前置斜杠
- 用Jackson的
ObjectMapper将输入流解析为WalletFile对象:
ObjectMapper objectMapper = new ObjectMapper(); WalletFile walletFile = objectMapper.readValue(inputStream, WalletFile.class);
- 解密钱包文件生成
Credentials:
Credentials credentials = Credentials.create(Wallet.decrypt(password, walletFile));
完整代码示例
try { AssetManager assetManager = getAssets(); InputStream inputStream = assetManager.open("keystore.json"); ObjectMapper objectMapper = new ObjectMapper(); WalletFile walletFile = objectMapper.readValue(inputStream, WalletFile.class); Credentials currentWallet = Credentials.create(Wallet.decrypt(password, walletFile)); // 这里可以使用currentWallet进行后续链上操作 } catch (IOException | CipherException e) { e.printStackTrace(); // 处理异常,比如密码错误、文件读取失败等 }
为什么之前的方法不行?
- 直接传字符串路径
"/some.json":这个路径指向的是设备根目录,而非Assets目录,自然找不到目标文件。 - 传File对象:Assets文件是打包在APK内部的资源,没有对应的本地文件系统File对象可以直接引用,必须通过AssetManager访问其输入流。
内容的提问来源于stack exchange,提问作者swatarianess
相关产品推荐
相关产品推荐

