Notice
Recent Posts
Recent Comments
Link
투케이2K
232. (AndroidStudio/android/java) 웹뷰 (webview) 크롬 사용해 이미지(image), 텍스트(txt), pdf, 동영상 등 파일 업로드 수행 실시 본문
Android
232. (AndroidStudio/android/java) 웹뷰 (webview) 크롬 사용해 이미지(image), 텍스트(txt), pdf, 동영상 등 파일 업로드 수행 실시
투케이2K 2021. 12. 10. 10:39[개발 환경 설정]
개발 툴 : AndroidStudio
개발 언어 : java
[소스 코드]
// TODO [크롬 클라이언트 설정 실시]
main_webview.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"[A_Main >> onShowFileChooser() :: 웹 브라우저 갤러리 호출 수행 실시]");
Log.i("","\n"+"[url :: "+String.valueOf(main_webview.getUrl())+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// [SEARCH FAST] : [파일 업로드]
/**
* [네이티브 추가 설정 사항]
* 1. 퍼미션 선언 :
* - <uses-permission android:name="android.permission.READ_PHONE_STATE" />
* - <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
* - <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
* 2. 전역 변수 선언 실시 : ValueCallback mFilePathCallback;
* */
// ----------------------------------
mFilePathCallback = filePathCallback; // 웹뷰 파일 콜백 지정 실시
// ----------------------------------
// [이미지 파일만 지정 시 사용 : <input type="file" accept="image/*" multiple>]
//Intent intent = new Intent(Intent.ACTION_PICK); // 갤러리 지정
//intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true); // 사진 다중 선택 지정
//intent.setType("image/*"); // 이미지 파일 타입 지정
//intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // 미디어 스토어 사용 [이미지]
//intent.setData(MediaStore.Video.Media.EXTERNAL_CONTENT_URI); // 미디어 스토어 사용 [동영상]
//intent.setData(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); // 미디어 스토어 사용 [오디오]
//startActivityForResult(intent, 0); // 응답 코드 0 삽입
// ----------------------------------
// [모든 형식 파일 지정 시 사용 : <input type="file" multiple>]
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); // 파일 지정 (image, txt, pdf ...)
intent.addCategory(Intent.CATEGORY_OPENABLE); // 카테고리 지정
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true); // 파일 다중 선택 지정
intent.setType("*/*"); // 모든 파일 지정
startActivityForResult(intent, 0); // 응답 코드 0 삽입
// ----------------------------------
return true;
}
});
// TODO [액티비티 인텐트 수행 결과 받기]
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// [파일 호출 인텐트 결과 확인 : startActivityForResult(intent, 0)]
// [SEARCH FAST] : [파일 업로드]
if (requestCode == 0 && resultCode == Activity.RESULT_OK) {
try {
if (data.getClipData() == null) {
Log.i("---", "---");
Log.w("//===========//", "================================================");
Log.i("", "\n" + "[A_Main >> onActivityResult() :: 파일 업로드 리턴 값 확인 수행]");
Log.i("", "\n" + "[getClipData :: "+String.valueOf("null")+"]");
Log.i("", "\n" + "[getData :: "+String.valueOf(data.getData())+"]");
Log.w("//===========//", "================================================");
Log.i("---", "---");
if (data.getData() == null){
// [파일 데이터가 널인 경우 처리]
mFilePathCallback.onReceiveValue(null); // 웹으로 데이터 null 전송
}
else {
mFilePathCallback.onReceiveValue(new Uri[]{data.getData()}); // 웹으로 데이터 전송 실시
}
}
else {
ClipData clipData = data.getClipData(); // 선택한 파일 데이터 얻어온다
int fileCount = clipData.getItemCount(); // 선택한 파일 개수 확인
Log.i("---", "---");
Log.d("//===========//", "================================================");
Log.i("", "\n" + "[A_Main >> onActivityResult() :: 파일 업로드 리턴 값 확인 수행]");
Log.i("", "\n" + "[파일 선택 개수 :: "+String.valueOf(fileCount)+"]");
Log.d("//===========//", "================================================");
Log.i("---", "---");
if (fileCount > 3) { // 파일 선택 제한 실시 [제한 개수 3개]
Log.i("---", "---");
Log.e("//===========//", "================================================");
Log.i("", "\n" + "[A_Main >> onActivityResult() :: 파일 업로드 수행 제한 실시]");
Log.i("", "\n" + "[파일 선택 개수 :: "+String.valueOf(fileCount)+"]");
Log.e("//===========//", "================================================");
Log.i("---", "---");
// [이미지 개수 제한 메시지 출력 실시]
Toast.makeText(getApplicationContext(), "파일은 3개 까지 선택가능합니다.", Toast.LENGTH_LONG).show();
mFilePathCallback.onReceiveValue(null); // 웹으로 데이터 null 전송
}
else if (fileCount == 1) { // 파일을 1개 선택했을 때
Uri imagePath = clipData.getItemAt(0).getUri(); // 파일 URI
mFilePathCallback.onReceiveValue(new Uri[]{imagePath}); // 웹으로 데이터 전송 실시
Log.i("---", "---");
Log.w("//===========//", "================================================");
Log.i("", "\n" + "[A_Main >> onActivityResult() :: 파일 업로드 수행 실시]");
Log.i("", "\n" + "[파일 선택 개수 :: "+String.valueOf(fileCount)+"]");
Log.i("", "\n" + "[imagePath :: "+String.valueOf(imagePath)+"]");
Log.w("//===========//", "================================================");
Log.i("---", "---");
}
else if (fileCount <= 3 && fileCount > 1) { // 파일을 1개 이상 선택했을 때 [다중 선택]
Uri[] filePathArray = new Uri[fileCount]; // 다중 파일을 담기 위한 배열 선언 실시
String stringData = "";
for (int i = 0; i < fileCount; i++) { // for 문을 돌면서 배열에 uri 데이터 삽입
filePathArray[i] = data.getClipData().getItemAt(i).getUri();
stringData += String.valueOf(data.getClipData().getItemAt(i).getUri()) + " ";
}
mFilePathCallback.onReceiveValue(filePathArray); // 웹으로 데이터 전송 실시
Log.i("---", "---");
Log.w("//===========//", "================================================");
Log.i("", "\n" + "[A_Main >> onActivityResult() :: 파일 업로드 수행 실시]");
Log.i("", "\n" + "[파일 선택 개수 :: "+String.valueOf(fileCount)+"]");
Log.i("", "\n" + "[filePathArray :: "+String.valueOf(stringData)+"]");
Log.w("//===========//", "================================================");
Log.i("---", "---");
}
}
//mFilePathCallback = null;
}
catch (Exception e){
e.printStackTrace();
}
}
else {
mFilePathCallback.onReceiveValue(null); // 웹으로 데이터 null 전송
}
}
[결과 출력]
반응형
'Android' 카테고리의 다른 글
Comments