Android和JAVA中接入web3j

1:先启动geth节点

geth --identity "xiaohong" --rpc --rpccorsdomain "*" --rpcaddr "192.168.1.105"  --datadir "./" --port "30303" --nodiscover --rpcapi "personal,db,eth,net,web3,miner" --networkid 1999 console 2>>geth.log

关键点在--rpcaddr 这个属性,这个如果没有设置的话 默认就是localhost 设置了就是通过该ip来访问

可以通过geth attach http://localhost:8545来测试没有设置的

通过geth attach http://rpcaddr:8545 rpcaddr就是命令中设置的值来访问

在安卓上localhost的时候不能写http://localhost:8545 要写http://10.0.2.2:8545;

2:在app下面的build.grade里面的dependencies里添加

implementation 'org.web3j:core:3.3.1-android'

接入web3j

3:调用web3j

package com.example.ppc.testgoeehereumapp;

import android.accounts.Account;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONException;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.Web3jFactory;
import org.web3j.protocol.admin.Admin;
import org.web3j.protocol.admin.AdminFactory;
import org.web3j.protocol.core.methods.response.NetVersion;
import org.web3j.protocol.core.methods.response.Web3ClientVersion;
import org.web3j.protocol.core.methods.response.Web3Sha3;
import org.web3j.protocol.http.HttpService;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button showButton;
    private TextView textview;

    private Button account_button;
    private TextView account_textview;

    private  Button new_account_button;

    public static final int SHOW = 0;

    String rpc_url = "http://192.168.1.105:8545";
    Web3j web3;
    Admin admin;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textview=(TextView)findViewById(R.id.textview123);
        showButton = (Button) findViewById(R.id.showView);
        showButton.setOnClickListener(this);

        account_textview=(TextView)findViewById(R.id.textview_accounts);
        account_button = (Button) findViewById(R.id.account_button);
        account_button.setOnClickListener(this);

        new_account_button = (Button) findViewById(R.id.new_account_button);
        new_account_button.setOnClickListener(this);

        initWeb3j();
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.showView) {
            getVersion();
        }else if (v.getId()==R.id.account_button){
            getAccounts();
        }else if (v.getId()==R.id.new_account_button){
            new_Accounts();
        }
    }

    private void getVersion() {
        VersionTask versionTask = new VersionTask();
        versionTask.execute();
    }

    private void getAccounts() {
        AccountsTask versionTask = new AccountsTask();
        versionTask.execute();
    }

    private void new_Accounts() {
        NewAccountsTask versionTask = new NewAccountsTask();
        versionTask.execute();
    }

    private class VersionTask extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... params) {
            String result ;
            try{
                String version = web3.web3ClientVersion().send().getResult();
                result = version;
            }catch (IOException e){
                e.printStackTrace();
                result = "获取版本号出错啦" + e.getMessage();
            }



            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            textview.setText(result);
            Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
        }
    }

    private class NewAccountsTask extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... params) {
            String result ;
            try{
                String version = admin.personalNewAccount("xiaohong").send().getResult();
                result = version;
            }catch (IOException e){
                e.printStackTrace();
                result = "获取版本号出错啦" + e.getMessage();
            }

            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
//            textview.setText(result);
            Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
        }
    }

    private class AccountsTask extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... params) {
            String result ;
            try{
                String account_string = "";

                List<String> accounts = web3.ethAccounts().send().getAccounts();
                account_string += accounts.size();
                for (String account:accounts){
                    account_string += "  \n " + account ;
                }
                result = account_string;
            }catch (IOException e){
                e.printStackTrace();
                result = "获取账号出错啦" + e.getMessage();
            }

            Log.e("xiaohong",result);

            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            account_textview.setText(result);
            Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
        }
    }

    private class InitWeb3JTask extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... params) {
            String url = params[0];
            String result = "Success initializing web3j/rpc";
            try {
                HttpService httpService =  new HttpService(url);
                web3 = Web3jFactory.build(httpService);  // defaults to http://localhost:8545/
                admin = AdminFactory.build(httpService);
            } catch (Exception wtf) {
                String exception = wtf.toString();
                Log.d("wat", "Error initializing web3j/infura. Error: " + exception);
            }

            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
        }
    }

    private void initWeb3j() {
        InitWeb3JTask task = new InitWeb3JTask();
        task.execute(rpc_url);
    }
}

 

4:在AndroidManifest.xml中加入

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

 

项目源码可在https://download.csdn.net/download/wahaha13168/10544522中下载

web3j文档:https://docs.web3j.io/getting_started.html#working-with-smart-contracts-with-java-smart-contract-wrappers

 


版权声明:本文为wahaha13168原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。