Android

Android Webview에서 Json가져오고 사용하기(feat.Gson)

김한토 2024. 9. 3. 18:00
반응형

웹뷰에서 데이터 던져주면 앱으로 받고 프린터를 출력하는 작업을 하고 있따. 

 

일단 웹뷰를 xml에 넣고 웹뷰가 있는 화면에 

binding.webView.addJavascriptInterface(WebHanto(), "android"))

 

를 써줘야 한다.

Android의 WebView에서 JavaScript와 Android 코드 간의 상호작용을 가능하게 하는 메서드이다.

이 코드의 역할은 다음과 같다.

  1. JavaScript와의 연결: WebBridge()라는 객체를 JavaScript에서 사용할 수 있도록 WebView에 추가한다. 이 객체는 JavaScript에서 호출할 수 있는 메서드를 정의할 수 있다.
  2. 이름 지정: "android"라는 이름을 통해 JavaScript에서 이 객체를 참조할 수 있게 된다. 즉, JavaScript 코드에서 android를 통해 Android의 메서드를 호출할 수 있다.
  3. 상호작용: 이를 통해 웹 페이지에서 Android의 기능을 호출하거나, Android 애플리케이션과 데이터를 주고받는 등의 상호작용을 구현할 수 있다.

 

// Javascript 인터페이스 클래스
inner class WebHanto() {

	@JavascriptInterface
    fun setMessage(arg: String) {

            Handler(Looper.getMainLooper()).post {
            
            when {
            
            arg == "minamina" -> {
                        Log.d("minamina", "minamina")
	        }
            
            setMina(arg) -> {
            	Log.d("WebBridge", "set Mina: $arg")
			}
            else -> {
                        example()
                    }
                }
            }
        }
        
        private fun setMina(arg: String): Boolean {
            //{"action":"mina","params":{"Name":"mina","age":25,"Character":[{"MBTI":"INFP"}.....
            Log.d("WebView", "setPrinter arg : $arg")

            return try {
                val json = JSONObject(arg)

                when (json.getString("action")) {
                    "mina" -> {
                        val params = json.getJSONObject("params")                       
                        val json = params.toString()
                        Log.d("WebView", "printContents: $json")
						true
                    }

                    else -> {
                        false
                    }
                }
            } catch (e: JSONException) {
                Log.e("WebView", "Failed to parse JSON: ${e.message}")
                false
            }
        }
    }
    
   ....

 

웹에서 setMina을 실행시키고 거기서 action이 mina면  함수가 실행되게 작성하였다. 

 

웹에서 보낸 json파일을 보려면 device explorer을 봐야한다.

핸드폰으로 테스트 중이면 보안 폴더를 삭제해야 보일 것이다. 

삭제 안하면 error executing shell command pm list packages 이런 오류 뜸.

 

그리고 받아오는 json 파일의 형태를 보고 data class를 작성해야 한다. 

 

Hanto.kt

/{"action":"mina","params":{"Name":"mina","age":25,"Character":[{"MBTI":"INFP"}.....

package com.example.hanto.data

import com.google.gson.annotations.SerializedName

data class Hanto(
    @SerializedName("Name") val name: String,
    @SerializedName("Age") val age: Int,
    @SerializedName("Character") val character: List<characterData>
)

data class characterData(
    @SerializedName("MBTI") val MBTI: String,
    ...
	@SerializedName("Happiness") val happiness: Int? = null,
)

 

 

그리고 데이터를 사용하는 곳에서

val gson = Gson()
var hanto : Hanto? = null

try {
	// JSON 문자열을 Hanto 객체로 변환
	receipt = gson.fromJson(json, Hanto::class.java)
	} catch (e: JsonSyntaxException) {
	Log.e(TAG, "Failed to parse JSON to Hanto: ${e.message}")
	} catch (e: Exception) {
	Log.e(TAG, "An unexpected error occurred: ${e.message}")
	}
    ...
    
    
  	//이런식으로 접근하면 된다.    
    hanto?.character?.MBTI....

 }

 

 

끝.

반응형