상세 컨텐츠

본문 제목

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

안드로이드

by aries574 2021. 6. 1. 16:31

본문


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

 

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

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

aries574.tistory.com

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

 

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

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

aries574.tistory.com

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

아래 그림은 업비트 거래소에서 코인(ETC)의 호가정보를 보여주는 화면입니다.

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

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

 

업비트 개발자 센터

업비트 Open API 사용을 위한 개발 문서를 제공 합니다.업비트 Open API 사용하여 다양한 앱과 프로그램을 제작해보세요.

docs.upbit.com

 

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="조회" />

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

 

4. 데이터 (호가정보)클래스 추가 (OrderBookVo.java)

public class OrderBookVo {

    String price; //호가
    String size; //잔량

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }
}

5. 리스트로 보여줄 화면 생성(orderbook_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/price"
                    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:textColor="#0E0505"
                    android:textSize="15sp" />

                <!-- 잔량 -->
                <TextView
                    android:id="@+id/size"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="right"
                    android:textStyle="bold"
                    android:text="0.2342343"
                    android:textColor="#0E0505"
                    android:textSize="15sp" />
        </LinearLayout>
    </androidx.cardview.widget.CardView>
</LinearLayout>

 

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

OrderBookAdapter.java

public class OrderBookAdapter 

extends RecyclerView.Adapter<OrderBookAdapter.ViewHolder>{

    public static final String TAG = "Adapter";

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

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

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

        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(OrderBookAdapter.ViewHolder viewHolder

                                             , int position) {

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

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

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

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


    static class ViewHolder extends RecyclerView.ViewHolder{

        TextView price; //호가
        TextView size; //잔량

        CardView cardView;

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

            price = itemView.findViewById(R.id.price);
            size = itemView.findViewById(R.id.size);
            cardView        = itemView.findViewById(R.id.cardView);
        }

        public void setItem(OrderBookVo item){

            int position = getAdapterPosition();

            if(position >= 15) { //매수 빨강

                if( position % 2 == 0){
                    cardView.setBackgroundColor(Color.rgb(255,162,162)); //옅은 빨강 아래랑
                }else{
                    cardView.setBackgroundColor(Color.rgb(255,198,198)); //완전 옅은 빨강
                }

                //텍스트뷰에 데이터 담기
                price.setText(item.getPrice());
                size.setText(item.getSize());
            }else{ //매도
                if(position % 2 == 0){
                    cardView.setBackgroundColor(Color.rgb(198,255,255)); //완전 옅은 파랑
                }else{
                    cardView.setBackgroundColor(Color.rgb(144,246,255)); // 옅은 파랑
                }

                //텍스트뷰에 데이터 담기
                price.setText(item.getPrice());
                size.setText(item.getSize());
            }

        } //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="조회" />

    <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;

    OrderBookAdapter 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 OrderBookAdapter();
        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()){
                    getOrderBooks(coinNm);
                }
            }
        });


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

    /**
     * 시세호가 정보 가져오기
     * @param coinNm 코인이름
     */
    private void getOrderBooks(String coinNm){

        final String sCoinNm = coinNm;


        String url = "https://api.upbit.com/v1/orderbook?markets=KRW-" + sCoinNm;

        StringRequest request = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        //조회
                        getOrderBooksData(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 getOrderBooksData(String data) {
        

        try {
                JSONArray jsonArray = new JSONArray(data);

                String ask_price; //매도 호가
                String bid_price; //매수 호가
                String ask_size; //매도 잔량
                String bid_size; //매수 잔량

                JSONObject jsonObject = jsonArray.getJSONObject(0);

                //변수에 호가정보를 담는다.
                String orderbook_units = jsonObject.get("orderbook_units").toString();

                //변수를 jsonArray 타입의 변수에 담는다.
                JSONArray arrayUnits = new JSONArray(orderbook_units);

                //매수,매도 정보를 담을 리스트 선언
                ArrayList<String> arr_ask_price = new ArrayList<>();
                ArrayList<String> arr_ask_size = new ArrayList<>();
                ArrayList<String> arr_bid_price = new ArrayList<>();
                ArrayList<String> arr_bid_size = new ArrayList<>();

                for (int i = 0; i < arrayUnits.length(); i++) {

                    //배열안에 있는 오브젝트 타입의 데이터를 변수에 담는다.
                    JSONObject objectUnits = arrayUnits.getJSONObject(i);

                    //변수에서 호가정보를 꺼내서 각각의 변수에 담는다.
                    ask_price = objectUnits.get("ask_price").toString();
                    ask_size = objectUnits.get("ask_size").toString();
                    bid_price = objectUnits.get("bid_price").toString();
                    bid_size = objectUnits.get("bid_size").toString();

                    //1000자리 콤마 처리
                    arr_ask_price.add(toDoubleFormat(Double.parseDouble(ask_price)));
                    arr_ask_size.add(toDoubleFormat(Double.parseDouble(ask_size)));
                    arr_bid_price.add(toDoubleFormat(Double.parseDouble(bid_price)));
                    arr_bid_size.add(toDoubleFormat(Double.parseDouble(bid_size)));
                }

                //매도 담기
                for (int j = (arr_ask_price.size()-1); j >= 0; j--) {
                    OrderBookVo vo = new OrderBookVo();
                    vo.setPrice(arr_ask_price.get(j));
                    vo.setSize(arr_ask_size.get(j));
                    adapter.addItem(vo);
                }

                //매수 담기
                for (int k = 0; k < arr_bid_price.size(); k++) {
                    OrderBookVo vo = new OrderBookVo();
                    vo.setPrice(arr_bid_price.get(k));
                    vo.setSize(arr_bid_size.get(k));
                    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
    
}//MainActivity

 

9. 실행화면

 

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

 

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

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

aries574.tistory.com

 

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

 

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

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

aries574.tistory.com

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

문의 댓글 환영합니다.

 

반응형

관련글 더보기

댓글 영역