투케이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 전송
        }
    }
 

[결과 출력]


반응형
Comments