2021.05.28 - [안드로이드] - [안드로이드]업비트 api를 사용해서 현재가 정보 가져오기
2021.05.31 - [안드로이드] - [안드로이드]업비트 api 사용해서 해당 코인 체결내역 가져오기
이번 시간에는 업비트 api를 사용해서 해당 코인 호가정보를 가져오는 앱을 만들어 보겠습니다.
아래 그림은 업비트 거래소에서 코인(ETC)의 호가정보를 보여주는 화면입니다.
업비트에서 지원해주는 api를 사용해서 직접 데이터를 가져와서 앱화면에 보여주겠습니다.
참조사이트: https://docs.upbit.com/reference
application 태그 위에 인터넷 권한을 등록해야 합니다.
<uses-permission android:name="android.permission.INTERNET"/>
dependencies 안에 라이브러리 추가
implementation 'com.android.volley:volley:1.2.0'
implementation 'org.json:json:20210307'
implementation 'androidx.cardview:cardview:1.0.0'
2020.12.19 - [안드로이드] - [안드로이드]라이브러리 찾아 등록하는 방법
<?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>
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;
}
}
<?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>
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
<?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>
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
2021.05.28 - [안드로이드] - [안드로이드]업비트 api를 사용해서 현재가 정보 가져오기
2021.05.31 - [안드로이드] - [안드로이드]업비트 api 사용해서 해당 코인 체결내역 가져오기
맘에 드셨다면 공감부탁드려요문의 댓글 환영합니다. |
[안드로이드]업비트 api(Java)를 사용해서 자산 리스트 조회 (0) | 2021.06.20 |
---|---|
[안드로이드]공통문자(strings.xml) 자바에서 호출하기 (0) | 2021.06.04 |
[안드로이드]업비트 api 사용해서 해당 코인 체결내역 가져오기 (0) | 2021.05.31 |
[안드로이드]업비트 api를 사용해서 현재가 정보 가져오기 (2) | 2021.05.28 |
[안드로이드] 개발앱 앱스토어 현황 (0) | 2021.02.08 |
댓글 영역