Android和JAVA中接入web3j
阿新 • • 發佈:2018-12-30
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"/>