2021.05.28 - [안드로이드] - [안드로이드]업비트 api를 사용해서 현재가 정보 가져오기
2021.05.31 - [안드로이드] - [안드로이드]업비트 api 사용해서 해당 코인 체결내역 가져오기
2021.06.01 - [안드로이드] - [안드로이드]업비트 api 사용해서 호가정보 가져오기
이번 시간에는 업비트 거래소에서 사용하는 api(Java)를 사용해서
자산 리스트를 가져오는 간단한 앱을 만들어 보겠습니다.
자산 리스트는 개인정보를 가져오는 것이기 때문에
업비트에서 액세스 키와 시크릿키를 신청해서 받아야 합니다.
신청하는 방법은 업비트 거래소 로그인하신 다음에
마이페이지 -> Open API 관리 -> Open API Key 발급받기를 하시면 됩니다.
업비트에서 지원해주는 예제는 Node, Python, Ruby, Java가 있습니다.
저같은 경우는 안드로이드앱에서 호출해야 하기 때문에 Java버전을 이용했습니다.
그대로 사용하니 에러가 뜨고 제대로 되지가 않더라고요.
설명 없이 소스만 있어서, 문제가 발생하면 초보자는 도대체 어디가 문제인지
정말 난감하고 답답했습니다. 구글링을 해서 원본 소스대로는 안 되겠구나 하며
수정을 해서 해결했습니다.
화면은 간단하게 조회, 취소 버튼이 있습니다.
조회 버튼을 누르면 반복해서 자산을 가져오는 api를 호출, 정지를 하면 멈추는 간단한 예제입니다.
application 태그 위에 인터넷 권한을 등록해야 합니다.
<uses-permission android:name="android.permission.INTERNET" />
dependencies 안에 라이브러리 추가
implementation 'io.jsonwebtoken:jjwt:0.9.1'
implementation 'cz.msebera.android:httpclient:4.5.8'
implementation 'org.json:json:20210307'
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">
<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>
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() {
}
}
}
실행하시면 자산 정보가 차례대로 나올 것입니다.
저 같은 경우는 보유하고 있는 코인이 없기 때문에 원화만 나온 것이며
코인을 갖고 있다면 코인 정보도 나옵니다.
맘에 드셨다면 공감부탁드려요문의 댓글 환영합니다. |
[안드로이드] 내가 선택한 색으로 배경색 변경하는 방법 (0) | 2021.06.30 |
---|---|
[안드로이드]정해진 시간에 알람 울리는 방법 Notification TimePicker (16) | 2021.06.28 |
[안드로이드]공통문자(strings.xml) 자바에서 호출하기 (0) | 2021.06.04 |
[안드로이드]업비트 api 사용해서 호가정보 가져오기 (0) | 2021.06.01 |
[안드로이드]업비트 api 사용해서 해당 코인 체결내역 가져오기 (0) | 2021.05.31 |
댓글 영역