Developer (Chinese)
  • 开始
  • 移动端钱包
    • 准备开始
    • Mobile SDK
      • iOS
      • Android
      • 常见问题
    • EOS MiniWallet SDK
      • iOS
      • Android
    • DeepLink方式拉起钱包操作
    • JS-SDK
    • EOS资源代付
    • 应用调试
    • 清除TP钱包缓存
  • 插件钱包
    • 指引
      • 介绍
      • 入门
      • 通用术语
      • 初始化dapp
      • 访问账户
      • 发送交易
    • API参考
      • 以太坊 Provider API
      • 波场 Provider API
      • RPC API
      • 签署数据
    • 常见问题
  • 二维码协议
    • 动态二维码
    • EVM网络
    • TRON
    • EOSIO
    • Solana
    • BTC
  • TIP协议
  • Wallet Connect
  • Token
    • Token价格显示支持
    • 添加 Token
    • 添加Token图标
    • FAQ
  • DApp
    • 添加DApp
    • FAQ
  • 公链
    • 公链唯一标识
    • 开放接口
      • Ethereum系列公链
      • Polkadot系列公链
      • EOSIO系列公链
    • 已支持的公链开放接口
      • 交易相关数据
      • 行情相关数据
    • 新增公链
      • 便捷加链介绍和展示
      • 初级支持介绍和展示
      • 高级支持介绍和展示
      • 添加定制链的支持
  • 常见问题
Powered by GitBook
On this page
  • 介绍
  • 准备工作
  • 使用过程
  • 方法说明
  • 总结
  • 错误排查
  1. 移动端钱包
  2. EOS MiniWallet SDK

Android

PreviousiOSNextDeepLink方式拉起钱包操作

Last updated 3 years ago

介绍

MiniWallet可以实现EOS网络,针对部分需要签名的操作,不用拉起TP钱包,直接在Dapp内部完成,从而使Dapp拥有更顺滑的用户体验。

准备工作

  • 下载wallet-sdk-release.aar

  • 将aar文件放到你项目工程下app模块下的libs目录,如果没有该文件夹,则创建

  • 添加依赖,在app目录下的build.gradle中添加以下代码

dependencies {
    compile(name:'wallet-sdk-release', ext:'aar')
}
  • 反混淆

# tokenpocket sdk
-dontwarn com.tokenpocket.opensdk.**
-keep class com.tokenpocket.opensdk.**{*;}
-keep interface com.tokenpocket.opensdk.**{*;}

使用过程

  • 初始化SDK

        TPManager.getInstance().initSDK(this);
        //设置主网和节点
        TPManager.getInstance().setBlockChain(this, NetTypeEnum.EOS_MAINNET, "http://openapi.eos.ren");
        //设置miniwallet插件地址
        TPManager.getInstance().setAppPluginNode(this, "http://eosinfo.mytokenpocket.vip");
        //设置一个密码,用来保护miniwallet数据,这里只是为了展示需要设置为12345
        TPManager.getInstance().setSeed(this, "123456");
  • 授权 这一步操作会自定义权限组,并且将需要使用miniwallet的操作链接到权限组

        AuthorizePerm authorizePerm = new AuthorizePerm();
        //添加权限组的账号
        authorizePerm.setAccount("ljxlzdh54321");
        authorizePerm.setPermExisted(false);
        //要添加的权限组的名字
        authorizePerm.setPerm("testtransfer");
        //和权限组关联的操作,只有把操作关联到添加的权限组上面了,才能利用自定义的权限进行相应的操作
        LinkAction linkAction = new LinkAction();
        //这里定义EOS上TPT的转账操作关联到自定义的testtransfer权限组
        linkAction.setContract("eosiotptoken");
        linkAction.setAction("transfer");
        linkActions.add(linkAction);
        authorizePerm.setActions(linkActions);

        authorizePerm.setDappIcon("https://newdex.io/static/logoicon.png");
        authorizePerm.setDappName("Test");
        authorizePerm.setSelectAll(true);

        TPManager.getInstance().auth(AuthActivity.this, authorizePerm, new TPListener() {
                    @Override
                    public void onSuccess(String data) {
                        //操作成功后,会返回本次操作的hash
                        Toast.makeText(AuthActivity.this, data, Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onError(String data) {
                        Toast.makeText(AuthActivity.this, data, Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onCancel(String data) {
                        Toast.makeText(AuthActivity.this, data, Toast.LENGTH_SHORT).show();
                    }
                });

授权成功后,就可以使用自定义权限组对应的key签名相关操作

  • 构造交易数据

    String actions = "[\n" +
            "        {\n" +
            "          \"account\": \"eosiotptoken\",\n" +
            "          \"name\": \"transfer\",\n" +
            "          \"authorization\": [\n" +
            "            {\n" +
            "              \"actor\": \"ljxlzdh54321\",\n" +
            "              \"permission\": \"testtransfer\"\n" +
            "            }\n" +
            "          ],\n" +
            "          \"data\": {\n" +
            "            \"from\": \"ljxlzdh54321\",\n" +
            "            \"memo\": \"ddd\",\n" +
            "            \"quantity\": \"0.0100 TPT\",\n" +
            "            \"to\": \"clementtes51\"\n" +
            "          }\n" +
            "        }\n" +
            "      ]";

这一步操作要注意:authorization的permission要填入定义权限组名字

  • 发送交易

发送交易前,首先检查交易数据中的权限是否已经link,如果没有link,则需要将上一步构造的交易数据中的authorization中permission替换成active,以便拉起钱包授权操作。如果已经link成功,则无需拉起钱包,直接在dapp中完成操作。

 private void pushTx() {
        final Transaction transaction = getTxData();
        //首先通过接口判断,本次执行的操作需要的权限,是否已经在账号中,这个链接的过程可以参考账号授权
        TPManager.getInstance().isPermLinkAction(this, transaction, new TPListener() {
            @Override
            public void onSuccess(String data) {
                //如果本次操作已经通过miniwallet授权,则将操作的参数修改为开发者自己定义的权限组,在demo实例中,
                //我们自定义的权限组是testtransfer,详情可参加授权AuthActivity.java
                replacePerm(transaction, transaction.getPerm());
            }

            @Override
            public void onError(String data) {
                //如果当前操作的权限组没有link到账号,则miniwallet无法完成当前操作,仍然需要拉起钱包授权
                replacePerm(transaction, "active");
            }

            @Override
            public void onCancel(String data) {

            }
        });
    }

    /**
     *
     * @param transaction
     * @param permission
     */
    private void replacePerm(Transaction transaction, String permission) {
        Json actions = new Json(transaction.getActions());
        for (int i = 0; i < actions.getLength(); i++) {
            Json authorization = actions.getObject(i, "{}").getArray("authorization", "[]")
                    .getObject(0, "{}");
            authorization.putString("permission", permission);
        }
        transaction.setActions(actions.toString());
        //将操作的permission替换成自定义的权限组后,就可以直接在miniwallet中完成操作,而不需要拉起tp 钱包授权
        realPushTx(transaction);
    }

    private void realPushTx(Transaction transaction) {
        TPManager.getInstance().pushTransaction(PushTxActivity.this, transaction, new TPListener() {
            @Override
            public void onSuccess(String data) {
                Toast.makeText(PushTxActivity.this, data, Toast.LENGTH_LONG).show();

            }

            @Override
            public void onError(String data) {
                Toast.makeText(PushTxActivity.this, data, Toast.LENGTH_LONG).show();

            }

            @Override
            public void onCancel(String data) {
                Toast.makeText(PushTxActivity.this, data, Toast.LENGTH_LONG).show();

            }
        });
    }

方法说明

initSDK() 初始化SDK

isPermLinkAction() 检查权限是否链接

getAccounts 获取授权账号

clearAuth 清除授权

auth 授权

总结

错误排查

  • 权限链接失败,请查看账号是否有足够的资源

  • 链接成功后,仍然需要拉起钱包操作。先检查操作参数是否配置正确。另外,对于一些涉及到用户资产安全的操作,即使配置正确,仍然需要拉起钱包确认。

使用Demo请查看:

https://github.com/TP-Lab/Mobile-SDK/blob/master/Android%20SDK/wallet-sdk-release.aar
https://github.com/TP-Lab/Mobile-SDK/tree/master/Android%20SDK/SDK_DEMO/app/src/main/java/tokenpocket/pro/sdk_demo/minwallet