상세 컨텐츠

본문 제목

[안드로이드]업비트 api 사용해서 해당 코인 체결내역 가져오기

안드로이드

by aries574 2021. 5. 31. 18:49

본문


2020.11.06 - [안드로이드] - [안드로이드]빗썸 api 사용해서 해당 코인 체결내역 가져오기

 

[안드로이드]빗썸 api 사용해서 해당 코인 체결내역 가져오기

2020/11/03 - [안드로이드] - [안드로이드]빗썸 api를 사용해서 현재가 정보 가져오기 2020/11/04 - [안드로이드] - [안드로이드]빗썸 api를 사용해서 현재 매도/매수 정보 가져오기 이번시간에는 해당 코

aries574.tistory.com

2021.05.28 - [안드로이드] - [안드로이드]업비트 api를 사용해서 현재가 정보 가져오기

 

[안드로이드]업비트 api를 사용해서 현재가 정보 가져오기

2020.11.03 - [안드로이드] - [안드로이드]빗썸 api를 사용해서 현재가 정보 가져오기 [안드로이드]빗썸 api를 사용해서 현재가 정보 가져오기 빗썸거래소에서는 외부 개발자 및 사용자들이  쉽게 이

aries574.tistory.com

이번 시간에는 업비트 api를 사용해서 해당 코인 체결내역을 가져오는 앱을 만들어 보겠습니다.

아래 그림은 업비트거래소에서 코인(ETC)의 최근 체결내역을 보여주는 화면입니다.

 

업비트에서 지원해주는 api를 사용해서 직접 데이터를 가져와서 앱화면에 보여주겠습니다.

참조사이트: https://docs.upbit.com/reference

1. 환경설정

AndroidManifest.xml

application 태그 위에 인터넷 권한을 등록해야 합니다.

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

2. 라이브러리 추가

build.gradle(Module: 앱이름.app)

dependencies 안에 라이브러리 추가

   implementation 'com.android.volley:volley:1.2.0'
    implementation 'org.json:json:20210307'
    implementation 'androidx.cardview:cardview:1.0.0'

 

2020.12.19 - [안드로이드] - [안드로이드]라이브러리 찾아 등록하는 방법

 

[안드로이드]라이브러리 찾아 등록하는 방법

2020/12/18 - [안드로이드] - [안드로이드]TextSwitcher 글자변환 애니메이션 만들어보기 이번 시간에는 안드로이드 개발을 하면서 원하는 기능을 쓰기 위해 라이브러리를 찾아서 등록하는 방법을 알아

aries574.tistory.com

 

3. 화면구성(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/edit_coinNm"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="코인을 입력하세요" />

    <Button
        android:id="@+id/btn_search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="조회" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:paddingLeft="10dp"
            android:text="체결시간" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="right"
            android:paddingRight="20dp"
            android:text="체결가격" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="right"
            android:paddingRight="20dp"
            android:text="체결량" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="체결금액(KRW)" />

    </LinearLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

 

4. 데이터 (체결내역)클래스 추가 (TradesVo.java)

 

public class TradesVo {

    String trade_date           = ""; //체결 일자(UTC 기준)
    String trade_time           = ""; //체결 시각(UTC 기준)
    String timestamp            = ""; //체결 타임스탬프
    String trade_price          = ""; //체결 가격
    String trade_krw            = ""; //체결 금액(KRW)
    String trade_volume         = ""; //체결량
    String ask_bid              = ""; //매도&매수

    public String getTrade_date() {
        return trade_date;
    }

    public void setTrade_date(String trade_date) {
        this.trade_date = trade_date;
    }

    public String getTrade_time() {
        return trade_time;
    }

    public void setTrade_time(String trade_time) {
        this.trade_time = trade_time;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getTrade_price() {
        return trade_price;
    }

    public void setTrade_price(String trade_price) {
        this.trade_price = trade_price;
    }

    public String getTrade_krw() {
        return trade_krw;
    }

    public void setTrade_krw(String trade_krw) {
        this.trade_krw = trade_krw;
    }

    public String getTrade_volume() {
        return trade_volume;
    }

    public void setTrade_volume(String trade_volume) {
        this.trade_volume = trade_volume;
    }

    public String getAsk_bid() {
        return ask_bid;
    }

    public void setAsk_bid(String ask_bid) {
        this.ask_bid = ask_bid;
    }
}

 

5. 리스트로 보여줄 화면 생성(trades_item.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <androidx.cardview.widget.CardView
        android:id="@+id/cardView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="2dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="2dp"
        app:cardElevation="5dp">

            <LinearLayout
                android:id="@+id/total2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <!-- 체결 시간 -->
                <TextView
                    android:id="@+id/trade_time"
                    android:layout_width="90dp"
                    android:layout_height="wrap_content"
                    android:gravity="left"
                    android:paddingLeft="10dp"
                    android:text="05.31 14:34"
                    android:textSize="11sp" />

                <!-- 체결 가격 -->
                <TextView
                    android:id="@+id/trade_price"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="right"
                    android:paddingRight="20dp"
                    android:textStyle="bold"
                    android:text="10,000,000"
                    android:textSize="11sp" />

                <!-- 체결량 -->
                <TextView
                    android:id="@+id/trade_volume"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="right"
                    android:textStyle="bold"
                    android:paddingRight="20dp"
                    android:text="0.2342343"
                    android:textSize="11sp" />

                <!-- 체결금액(KRW) -->
                <TextView
                    android:id="@+id/trade_krw"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="right"
                    android:textStyle="bold"
                    android:text="10,000,000"
                    android:textSize="11sp" />
        </LinearLayout>

    </androidx.cardview.widget.CardView>

</LinearLayout>

 

6. 어뎁터 클래스 추가(데이터를 리스트로 보여주기 위한 기능)

TradesAdapter.java

public class TradesAdapter extends RecyclerView.Adapter<TradesAdapter.ViewHolder>{

    ArrayList<TradesVo> items = new ArrayList<>();

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
        View itemView = inflater.inflate(R.layout.trades_item, viewGroup, false);

        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(TradesAdapter.ViewHolder viewHolder, int position) {

        TradesVo item = items.get(position);
        viewHolder.setItem(item);
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    /**
     * 아이템 등록
     * @param tradesVo
     */
    public void addItem(TradesVo tradesVo){
        items.add(tradesVo);
    }

    /**
     * 아이템 전체삭제
     */
    public void removeAllItem(){
        items.clear();
    }


    static class ViewHolder extends RecyclerView.ViewHolder{

        TextView trade_time; //체결시간
        TextView trade_price;//체결 가격
        TextView trade_volume; //체결 갯수
        TextView trade_krw; //체결금액(KRW)

        String type = "";

        public ViewHolder(View itemView) {
            super(itemView);

            trade_time = itemView.findViewById(R.id.trade_time);
            trade_price = itemView.findViewById(R.id.trade_price);
            trade_volume = itemView.findViewById(R.id.trade_volume);
            trade_krw = itemView.findViewById(R.id.trade_krw);
        }

        public void setItem(TradesVo item){

            type = item.getAsk_bid();

            trade_time.setText(item.trade_time);
            trade_price.setText(item.trade_price);
            trade_volume.setText(item.trade_volume);
            trade_krw.setText(item.trade_krw);

            if(type.equals("ASK")){ //매도

                trade_price.setTextColor(Color.rgb(0,84,255)); //파랑
                trade_volume.setTextColor(Color.rgb(0,84,255));

            }else{ //매수
                trade_price.setTextColor(Color.rgb(219,0,0)); //빨강
                trade_volume.setTextColor(Color.rgb(219,0,0));
            }
        } //setItem
    }//ViewHolder
}//TradesAdapter

 

7. 메인화면 구현(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/edit_coinNm"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="코인을 입력하세요" />

    <Button
        android:id="@+id/btn_search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="조회" />


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:paddingLeft="10dp"
            android:text="체결시간" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="right"
            android:paddingRight="20dp"
            android:text="체결가격" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="right"
            android:paddingRight="20dp"
            android:text="체결량" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="체결금액(KRW)" />

    </LinearLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

 

8. 메인코드 구현(MainActivity.java)

public class MainActivity extends AppCompatActivity {

    private RequestQueue requestQueue;

    private static final String TAG = "Main";

    EditText edit_coinNm;

    RecyclerView recyclerView;

    TradesAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //레이아웃 설정
        LinearLayoutManager layoutManager;

      layoutManager  =  new LinearLayoutManager(getApplicationContext()

                                                ,RecyclerView.VERTICAL, false);

        recyclerView = findViewById(R.id.recyclerView);

        //recyclerView 설정
        recyclerView.setLayoutManager(layoutManager);

        adapter = new TradesAdapter();
        recyclerView.setAdapter(adapter);

        //조회버튼
        Button btn_search = findViewById(R.id.btn_search);
        btn_search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                adapter.removeAllItem();

                edit_coinNm = findViewById(R.id.edit_coinNm);

                String coinNm = edit_coinNm.getText().toString().toUpperCase();

                if(!coinNm.isEmpty()){
                    getTrades(coinNm, "10");
                }
            }
        });


        if(requestQueue == null){
            requestQueue = Volley.newRequestQueue(getApplicationContext());
        }
    }

    /**
     * 체결내역 가져오기
     * @param coinNm 코인이름
     * @param count 체결내역 갯수
     */
    private void getTrades(String coinNm, String count){

        final String sCoinNm = coinNm;
        final String sCount = count;

        String url = "https://api.upbit.com/v1/trades/ticks?market=KRW-"

                        + sCoinNm + "&count="+sCount;

        StringRequest request = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        //조회
                        getTradesData(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.d(TAG, "onErrorResponse: " + error.getMessage());
                    }
                }){
        };
        request.setShouldCache(false);
        requestQueue.add(request);
    } //getTrades

    private void getTradesData(String data) {

        Log.d(TAG, "getTickerData: " + data);

        try {
            JSONArray jsonArray = new JSONArray(data);

            String localTime;
            String sTrade_price;
            String sTrade_volume;

            double dTrade_price;
            double dTrade_volume;

            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);

                String trade_date_utc = jsonObject.get("trade_date_utc").toString();//체결일자
                String trade_time_utc = jsonObject.get("trade_time_utc").toString();//체결시각
                String trade_price    = jsonObject.get("trade_price").toString();//체결 가격
                String trade_volume   = jsonObject.get("trade_volume").toString();//체결량
                String ask_bid        = jsonObject.get("ask_bid").toString();//매도&매수;

                //국내 시간으로 변경
                localTime = convertUtcToLocal(trade_time_utc);

                //가격, 갯수 계산을 위해 타입변경
                dTrade_price = Double.parseDouble(trade_price);
                dTrade_volume = Double.parseDouble(trade_volume);

                //체결금액 계산(체결가격*체결갯수)
                String price_krw =  toDoubleFormat(dTrade_price * dTrade_volume);

                //금액 콤마처리
                sTrade_price = toDoubleFormat(dTrade_price);
                sTrade_volume =toDoubleFormat(dTrade_volume);

                TradesVo vo = new TradesVo();
                vo.setTrade_time(localTime);
                vo.setTrade_price(sTrade_price);
                vo.setTrade_volume(sTrade_volume);
                vo.setTrade_krw(price_krw);
                vo.setAsk_bid(ask_bid);

                adapter.addItem(vo);
            }

            adapter.notifyDataSetChanged();

        }catch (JSONException e){
            e.printStackTrace();
        }
    }//getTradesData

    /**
     * 1000자리 콤마
     * @param num
     * @return
     */
    public  String toDoubleFormat(Double num) {

        DecimalFormat df = null;

        if(num >= 100 && num <= 999.9){
            df = new DecimalFormat("000.0");
        }else if(num >= 10 && num <= 99.99){
            df = new DecimalFormat("00.00");
        }else if(num >= 1 && num <= 9.9999){
            df = new DecimalFormat("0.000");
        }else if(num < 1){
            df = new DecimalFormat("0.0000");
        }else{
            df = new DecimalFormat("###,###,###");
        }

        return df.format(num);
    }//toDoubleFormat

    /**
     * UTC -> 현지 시간으로
     * @param utcTime
     * @return
     */
    public String convertUtcToLocal(String utcTime){

        String localTime = "";

        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

        try{
            //표준시를 Date 포맷으로 변경
            Date dateUtcTime = dateFormat.parse(utcTime);

            //표준시 Date 포맷을 long 타입의 시간으로 변경
            long longUtcTime = dateUtcTime.getTime();

            //TimeZone을 통해 시간차이 계산
            TimeZone zone = TimeZone.getDefault();
            int offset = zone.getOffset(longUtcTime);
            long longLocalTime = longUtcTime + offset;

            //long타입의 로컬 시간을 Date 포맷으로 변경
            Date dateLocalTime = new Date();

            dateLocalTime.setTime(longLocalTime);

            //로컬 시간을 문자열로 변경하여 리턴
            localTime = dateFormat.format(dateLocalTime);

        }catch (ParseException e){
            e.printStackTrace();
        }

        return  localTime;
    } //convertUtcToLocal
}//MainActivity

 

9. 실행화면

 

2020.11.06 - [안드로이드] - [안드로이드]빗썸 api 사용해서 해당 코인 체결내역 가져오기

 

[안드로이드]빗썸 api 사용해서 해당 코인 체결내역 가져오기

2020/11/03 - [안드로이드] - [안드로이드]빗썸 api를 사용해서 현재가 정보 가져오기 2020/11/04 - [안드로이드] - [안드로이드]빗썸 api를 사용해서 현재 매도/매수 정보 가져오기 이번시간에는 해당 코

aries574.tistory.com

2021.05.28 - [안드로이드] - [안드로이드]업비트 api를 사용해서 현재가 정보 가져오기

 

[안드로이드]업비트 api를 사용해서 현재가 정보 가져오기

2020.11.03 - [안드로이드] - [안드로이드]빗썸 api를 사용해서 현재가 정보 가져오기 [안드로이드]빗썸 api를 사용해서 현재가 정보 가져오기 빗썸거래소에서는 외부 개발자 및 사용자들이  쉽게 이

aries574.tistory.com

맘에 드셨다면 공감부탁드려요

문의 댓글 환영합니다.

 

반응형

관련글 더보기

댓글 영역