Notice
Recent Posts
Recent Comments
Link
투케이2K
181. (TWOK/ERROR) [Android] 웹뷰 (Webview) 에서 자바스크립트 input file 재동작 하지 않는 이슈 - onShowFileChooser File 본문
투케이2K 에러관리
181. (TWOK/ERROR) [Android] 웹뷰 (Webview) 에서 자바스크립트 input file 재동작 하지 않는 이슈 - onShowFileChooser File
투케이2K 2023. 10. 27. 09:56[환경 설정 및 설명]
프로그램 : AndroidStudio
설 명 : [Android] 웹뷰 (Webview) 에서 자바스크립트 input file 재동작 하지 않는 이슈 - onShowFileChooser File
[에러 원인]
1. 안드로이드 웹뷰 (Webview) onShowFileChooser 사용해 파일 선택 수행 시 사용자 중도 취소 발생 시 다음 번 input file 태그 이벤트 동작이 발생 하지 않는 이슈
[해결 방법]
1. onShowFileChooser 에서 갤러리 및 파일로 인텐트 수행 후 사용자가 취소 버튼 클릭 시 onResume 에서 null 초기화 실시
>> 만약, 선택한 파일이 있는 경우 registerForActivityResult 쪽으로 이벤트 콜백이 먼저 내려온다.
>> 사용자가 취소 클릭 시 앱 라이프 사이클 onResume 에서 null 초기화 필요
// --------------------------------------------------------------------------------------------------
[사용자가 중도 취소 버튼 클릭 처리 : 소스 코드]
// --------------------------------------------------------------------------------------------------
public override fun onResume() {
super.onResume()
// ===============================================================
S_Log._F_(this@A_Webview, S_FinalMsg.LOG_Activity_onResume, null)
// ===============================================================
// ---------------------------------------------------------------
// 외부 브라우저 복귀 시 화면 전환 애니메이션 없애기 위함
// ---------------------------------------------------------------
try { overridePendingTransition(0, 0) } catch (e: Exception) { S_Log._printStackTrace_(null, S_FinalMsg.LOG_BUG_STATE, null, e) }
// ---------------------------------------------------------------
// [웹뷰 파일 선택 취소 체크]
// ---------------------------------------------------------------
try {
if (mFilePathCallback != null) {
mFilePathCallback!!.onReceiveValue(null)
mFilePathCallback = null
}
} catch (e: Exception) {
}
}
// --------------------------------------------------------------------------------------------------
[이미지 선택 완료 콜백 응답 처리 : 소스 코드]
// --------------------------------------------------------------------------------------------------
val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
S_Log._F_(this@A_Webview, "ActivityResultLauncher :: 인텐트 응답 결과 확인", arrayOf(
"RESULT :: $result"
))
// -----------------------------------------
// TODO [정상적으로 응답을 받은 경우]
// -----------------------------------------
if (result.resultCode == RESULT_OK) {
// -----------------------------------------
// [인텐트 데이터 얻어 온다]
// -----------------------------------------
val intent = result.data
// -----------------------------------------
// -----------------------------------------
// TODO [선택한 파일 전송] : onResume 에서 [취소] 한 경우 null 처리 필요
// -----------------------------------------
// TODO [onResume 에서 null 전송 처리를 안해 주면 input file 이벤트 동작 안됨]
// -----------------------------------------
if (mFilePathCallback != null) {
if (intent == null) {
S_Log._E_("[SEND] :: [파일 전송] :: intent :: null", null)
mFilePathCallback!!.onReceiveValue(null) // 웹으로 데이터 null 전송
mFilePathCallback = null // 초기화
}
else {
val clipData = intent.clipData // 선택한 파일 데이터 얻어온다
val fileCount = clipData!!.itemCount // 선택한 파일 개수 확인
if (fileCount > 0) { // 선택한 파일 있음
val filePathArray = arrayOfNulls<Uri>(fileCount) // 다중 파일을 담기 위한 배열 선언 실시
var stringData = ""
for (i in 0 until fileCount) { // for 문을 돌면서 배열에 uri 데이터 삽입
filePathArray[i] = intent.clipData!!.getItemAt(i).uri
stringData += "\n\n${intent.clipData!!.getItemAt(i).uri}"
}
S_Log._W_("[SEND] :: [파일 전송] :: mFilePathCallback :: getClipData", arrayOf(
"File Count :: $fileCount",
"File Path :: $stringData"
))
mFilePathCallback!!.onReceiveValue(filePathArray as Array<Uri>) // 웹으로 데이터 전송 실시
mFilePathCallback = null // 초기화
}
else {
S_Log._E_("[SEND] :: [파일 전송] :: fileCount :: null", null)
mFilePathCallback!!.onReceiveValue(null) // 웹으로 데이터 null 전송
mFilePathCallback = null // 초기화
}
}
} else {
S_Log._E_("[SEND] :: [파일 전송] :: mFilePathCallback :: null", null)
}
// -----------------------------------------
}
}
반응형
'투케이2K 에러관리' 카테고리의 다른 글
Comments