2020.11.06 - [안드로이드] - [안드로이드]빗썸 api 사용해서 해당 코인 체결내역 가져오기
2021.05.28 - [안드로이드] - [안드로이드]업비트 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="조회" />
<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>
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;
}
}
<?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>
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
<?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>
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
2020.11.06 - [안드로이드] - [안드로이드]빗썸 api 사용해서 해당 코인 체결내역 가져오기
2021.05.28 - [안드로이드] - [안드로이드]업비트 api를 사용해서 현재가 정보 가져오기
맘에 드셨다면 공감부탁드려요문의 댓글 환영합니다. |
[안드로이드]공통문자(strings.xml) 자바에서 호출하기 (0) | 2021.06.04 |
---|---|
[안드로이드]업비트 api 사용해서 호가정보 가져오기 (0) | 2021.06.01 |
[안드로이드]업비트 api를 사용해서 현재가 정보 가져오기 (2) | 2021.05.28 |
[안드로이드] 개발앱 앱스토어 현황 (0) | 2021.02.08 |
[안드로이드] 전화걸기(Intent.ACTION_VIEW) 기능 만들어보기 (0) | 2021.02.02 |
댓글 영역