1. 程式人生 > >Android和JAVA中接入web3j

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"/>