본문 바로가기
Android

[Android] 오픈API 사용한 앱 만들기: 안드로이드 네트워크 통신, Volley, JSON 데이터 파싱, 스크롤뷰

by eyoo 2022. 7. 11.

안드로이드에서 Volley는 네트워크 통신하는 라이브러리이다.

# retrofit2와 비슷하다.

 

Volley 주소: https://google.github.io/volley/

 

Volley overview

Volley overview Volley is an HTTP library that makes networking for Android apps easier and most importantly, faster. Volley is available on GitHub. Volley offers the following benefits: Automatic scheduling of network requests. Multiple concurrent network

google.github.io

 

 

Gradle Script에서 build.gradle로 간다 그리고 거기에 제공된 코드를 입력한다.

 

    implementation 'com.android.volley:volley:1.2.1'

 

 

lyricsovh로 가사를 찾는 앱을 만들어보자.

 

주소: https://lyricsovh.docs.apiary.io/#reference/0/lyrics-of-a-song/search

 

lyrics.ovh · Apiary

 

lyricsovh.docs.apiary.io

 

 

먼저 activity_main.xml에서 앱의 디자인을 정한다.

 

 

 

그 후 메인에서 코드를 작성한다.

 

    EditText editName;
    EditText editSong;
    Button btnLyrics;
    TextView txtLyrics;

    final String URL = "https://api.lyrics.ovh/v1/";  // 사용할 API의 URL, final을 사용하여 변경되지 않도록 한다.


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

        editName = findViewById(R.id.editName);
        editSong = findViewById(R.id.editSong);
        btnLyrics = findViewById(R.id.btnLyrics);
        txtLyrics = findViewById(R.id.txtLyrics);

        // 버튼을 누르면 네트워크를 통해 API를 호출하고 호출 결과를 화면에 표시한다.

        btnLyrics.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // 버튼을 누르면 에디트텍스트에서 유저가 입력한 문자열을 가지고온다.
                String name  = editName.getText().toString().trim();
                String song  = editSong.getText().toString().trim();

                // 데이터가 한쌍으로 꼭 있어야 한다.

                if (name.isEmpty() || song.isEmpty()){
                    Toast.makeText(getApplicationContext(),"이름이나 노래제목은 필수로 입력하세요",Toast.LENGTH_SHORT).show();
                    return;
                }

                // 해당 데이터들을 조합하여 API를 호추란다.
                String apiUrl = URL + name+"/"+song;

                RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);

                // 네트워크 통신을 위한 Request를 만들어야 하는데
                // Json으로 통신하기 때문에
                // JsonObjectRequest 클래스 객체 생성한다.
                // 생성자는 http 메소드, API URL, 전달할 데이터, 응답 받으면 실행할 코드, 에러코드
                JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, apiUrl,null, new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        // API를 호출한 결과가 여기에 실행됨.
                        // 여기에 가사를 화면에 보여주는 코드 작성
                        Log.i("MyLyrics", response.toString());
                        txtLyrics.setText(response.toString());
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.i("MyLyrics", error.toString());
                    }
                });
                jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(60000,
                        DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

                requestQueue.add(jsonObjectRequest);


            }

 

 

그 후 network_security_config.xml 파일을  res의 xml에 만들고 아래의 코드를 입력한다.

 

<?xml version="1.0" encoding="utf-8" ?>

<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">*.lyrics.ovh</domain>
    </domain-config>
</network-security-config>

 

 

이제 앱에 인터넷 권한을 주기 위해 AndroidManifest.xml에서 uses-permission을 설정한다.

 

    // < manifest
    android:targetSandboxVersion="1">  // 에뮬레이터 용

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

    <application
        android:usesCleartextTraffic="true"
        android:networkSecurityConfig="@xml/network_security_config"

 

 

잘 실행되는것을 확인할수있다.

 

 

 

모든 가사를 스크롤하여 볼수있도록 ScrollView를 활용한다.

 

# 스크롤뷰를 넣으면 버티컬 리니어 레이아웃이 자동적으로 생기는데 스크롤하고싶은 컨텐츠를 넣는다.

 

 

그 후 JSON  데이터를 파싱한다.

 

                        // json객체에서 우리가원하는 정보를 빼내야 한다.
                        try {
                            String lyrics = response.getString("lyrics");
                            txtLyrics.setText(lyrics);
                        } catch (JSONException e) {
                            e.printStackTrace();
                            Toast.makeText(getApplicationContext(),
                                    "네트워크 에러입니다.",Toast.LENGTH_SHORT).show();
                            return;
                        }

# JsonObject에서 내가 가져올 데이터가

# 문자열이라면 getString("키")
# float이면 getFloat

# double이면 getDouble

# 리스트면 getJsonArray

셔너리면 getJsonObject 로 데이터를 가져올수있다.

 

 

스크롤도 되고 데이터도 잘 가져온것을 볼수있다.

 

 

 

 

 

 

 

댓글