상세 컨텐츠

본문 제목

[안드로이드]업비트 api(Java)를 사용해서 자산 리스트 조회

안드로이드

by aries574 2021. 6. 20. 12:05

본문


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

 

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

 

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

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

aries574.tistory.com

 

이번 시간에는 업비트 거래소에서 사용하는 api(Java)를 사용해서

자산 리스트를 가져오는 간단한 앱을 만들어 보겠습니다. 

자산 리스트는 개인정보를 가져오는 것이기 때문에

업비트에서 액세스 키와 시크릿키를 신청해서 받아야 합니다.

신청하는 방법은 업비트 거래소 로그인하신 다음에

마이페이지 -> Open API 관리 -> Open API Key 발급받기를 하시면 됩니다.

 

업비트에서 지원해주는 예제는 Node, Python, Ruby, Java가 있습니다.

저같은 경우는 안드로이드앱에서 호출해야 하기 때문에 Java버전을 이용했습니다.

그대로 사용하니 에러가 뜨고 제대로 되지가 않더라고요. 

설명 없이 소스만 있어서, 문제가 발생하면 초보자는 도대체 어디가 문제인지

정말 난감하고 답답했습니다. 구글링을 해서 원본 소스대로는 안 되겠구나 하며

수정을 해서 해결했습니다. 

화면은 간단하게 조회, 취소 버튼이 있습니다.

조회 버튼을 누르면 반복해서 자산을 가져오는 api를 호출, 정지를 하면 멈추는 간단한 예제입니다. 

 

1. 환경설정(Androidmanifest.xml)

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

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

2. 라이브러리 추가

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

dependencies 안에 라이브러리 추가

    implementation 'io.jsonwebtoken:jjwt:0.9.1'
    implementation 'cz.msebera.android:httpclient:4.5.8'
    implementation 'org.json:json:20210307'

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">
    
    <Button
        android:id="@+id/btn_search"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="조회"
        android:layout_gravity="center"
        android:layout_margin="100dp"
        />

    <Button
        android:id="@+id/btn_cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="취소"
        android:layout_gravity="center"
        android:layout_margin="100dp"
        />
</LinearLayout>

 

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

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;

import cz.msebera.android.httpclient.HttpEntity;
import cz.msebera.android.httpclient.HttpResponse;
import cz.msebera.android.httpclient.client.HttpClient;
import cz.msebera.android.httpclient.client.methods.HttpGet;
import cz.msebera.android.httpclient.impl.client.HttpClientBuilder;
import cz.msebera.android.httpclient.util.EntityUtils;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;


public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main";

    int value = 0;

    String accessKey = "액세스키값";
    String secretKey = "시크릿키값";
    String serverUrl = "https://api.upbit.com";

    private  BackgroundTask task;

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

        //조회버튼
        Button btn_search = findViewById(R.id.btn_search);
        btn_search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                task = new BackgroundTask();
                task.execute(); //반복시작
            }
        });

        //취소버튼
        Button btn_cancel = findViewById(R.id.btn_cancel);
        btn_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                task.cancel(true); //반복 취소
            }
        });
    }

    private void getAccounts() throws UnsupportedEncodingException, 

            NoSuchAlgorithmException {

              String jwtToken = Jwts.builder()
               .claim("access_key",accessKey)
                .claim("nonce",UUID.randomUUID().toString())
                .signWith(SignatureAlgorithm.HS256, secretKey.getBytes())
                .compact();

        String authenticationToken = "Bearer " + jwtToken;

        try {
            HttpClient client = HttpClientBuilder.create().build();
            HttpGet request = new HttpGet(serverUrl + "/v1/accounts");
            request.setHeader("Content-Type", "application/json");
            request.addHeader("Authorization", authenticationToken);

            HttpResponse response = client.execute(request);
            HttpEntity entity = response.getEntity();

            //1. 데이터 담기
            String data =  EntityUtils.toString(entity);

            String currency      = ""; //화폐 종류
            String balance       = "";//주문가능 금액/수량
            String locked        = ""; //주문 중 묶여있는 금액
            String avg_buy_price = ""; //매수 평균가

            //2. 데이터를 배열에 담기
            JSONArray jsonArray = new JSONArray(data);

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

                //3. 배열에 있는 오브젝트를 오브젝트에 담기
                JSONObject jsonObject = jsonArray.getJSONObject(i);

                //4. 오브젝트에 있는 데이터를 key값으로 불러오기
                currency      = jsonObject.get("currency").toString();//화폐 종류
                balance       = jsonObject.get("balance").toString();//주문가능 금액&수량
                locked        = jsonObject.get("locked").toString();//주문 중 묶여있는 금액&수량
                avg_buy_price = jsonObject.get("avg_buy_price").toString();//매수 평균가

                Log.d(TAG, "화폐종류: " + currency);
                Log.d(TAG, "주문가능 금액&수량: " + balance);
                Log.d(TAG, "주문 중 묶여있는 금액&수량: " + locked);
                Log.d(TAG, "매수 평균가: " + avg_buy_price);
            }

        } catch (IOException | JSONException e) {
            e.printStackTrace();
        }
    }


    class BackgroundTask extends AsyncTask<Integer, String, Integer>
    {
        protected void onPreExecute(){ }

        @RequiresApi(api = Build.VERSION_CODES.CUPCAKE)
        @Override
        protected Integer doInBackground(Integer... values) {

            //정지 시킬때까지 반복
            while(!isCancelled()){

                try{
                    getAccounts();
                    Thread.sleep(1000);
                }catch (InterruptedException ex){
                    ex.printStackTrace();
                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }//while
            return value;
        }

        //상태확인
        @Override
        protected void onProgressUpdate(String... values) {

        }

        @Override
        protected void onPostExecute(Integer integer) {
        }

        @Override
        protected void onCancelled() {
        }
    }
}

 

5. 실행화면

실행하시면 자산 정보가 차례대로 나올 것입니다.

저 같은 경우는 보유하고 있는 코인이 없기 때문에 원화만 나온 것이며

코인을 갖고 있다면 코인 정보도 나옵니다.

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

문의 댓글 환영합니다.

 

반응형

관련글 더보기

댓글 영역