마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

웹뷰 파일첨부시 권한 확인하기

0 추천

웹뷰에서 input태그를 이용해서 파일 첨부를 하려 합니다.

이 경우 킷캣을 제외하고는 input 파일첨부 버튼을 클릭하면 안드로이드 버전별로 

openFileChooser 같은 함수가 자동 호출되서 파일을 선택하거나 카메라를 이용할 수 있도록 했습니다.

현재는 onCreate 안에서

webView.setWebChromeClient(new WebChromeClient() {
            // For Android < 3.0
            public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                openFileChooser(uploadMsg, "");
            }
            // For Android 3.0+
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
                filePathCallbackNormal = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("image/*");
                startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_NORMAL_REQ_CODE);
            }
            // For Android 4.1+
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                openFileChooser(uploadMsg, acceptType);
            }
            // For Android 5.0+
            public boolean onShowFileChooser(
                    WebView webView, ValueCallback<Uri[]> filePathCallback,
                    WebChromeClient.FileChooserParams fileChooserParams) {
                if (filePathCallbackLollipop != null) {
//                    filePathCallbackLollipop.onReceiveValue(null);
                    filePathCallbackLollipop = null;
                }
                filePathCallbackLollipop = filePathCallback;
                // Create AndroidExampleFolder at sdcard
                File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyApp");
                if (!imageStorageDir.exists()) {
                    // Create AndroidExampleFolder at sdcard
                    imageStorageDir.mkdirs();
                }
                // Create camera captured image file path and name
                File file = new File(imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg");
                mCapturedImageURI = Uri.fromFile(file);

                Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);

                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("image/*");

                // Create file chooser intent
                Intent chooserIntent = Intent.createChooser(i, "Select Image");
                // Set camera intent to file chooser
                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[]{captureIntent});

                // On select image call onActivityResult method of activity
                startActivityForResult(chooserIntent, FILECHOOSER_LOLLIPOP_REQ_CODE);
                return true;

            }

위와 같이 처리되어 있습니다.

그런데, 이걸 마쉬멜로우 기준으로 권한을 요청하려면 대략 어떤 프로세스가 필요할까요?

html의 input 버튼 클릭 -> 권한 요구 대화상자 -> 허가시 카메라나 갤러리에서 이미지 선택

이렇게 하고 싶습니다.

사이타마 (1,090 포인트) 님이 2017년 1월 17일 질문

1개의 답변

0 추천
 
채택된 답변
http://gun0912.tistory.com/55

이 블로그 참조 하셔시구요 파일 choose하는 코드를 메서드로 완전히 분리 시키고

READ_EXTERNAL_STORAGE에 대한 권한이 GRANT됐을 경우 FileChoose 하도록 코드를 분기 처리 하면 됩니다.

위 라이브러리 사용시 런타임 퍼미션에 대한 허용/거부로 Callback이 떨어지기 때문에 쉽게 설정할 수 있어요.
라쎄린드 (25,460 포인트) 님이 2017년 1월 17일 답변
사이타마님이 2017년 1월 17일 채택됨
먼저 답변감사드립니다.
그러면 html의 input 버튼 클릭 이벤트로 안드로이드 함수를 호출하고
그 함수 안에서 해당 블로그의 퍼미션 리스너를 생성하고 허용 콜백이 떨어지면
파일 choose하는 함수를 호출 <- 이런식이 되는건가요?
아하 ! 넵 웹뷰 클라이언트가 아니라 AddJavascriptInterface로 추가된걸로
window.지시어.메서드명() 이런식으로 호출이 가능하잖아요? 그걸로 메서드() 상에서 권한처리한 후 grant일때 파일 choose하는 함수를 호출(근데 이게 가능한지는 모르겠네요) 하면 됩니다.
요거 다른분께도 물어보고 추가 댓글 달겠습니다 ㅎ
저기...타겟 23으로 해도 그냥 파일choose 가 되는데요 ㅇㅅㅇ;;;;;;;
기본앱으로 부터 파일을 가져오는거라(ACTION_VIEW)처럼 그냥되네요
하하하;;; 파일리스트를 직접 구현해서 가지고 오는게 아니라서 그런경우가 아니라면
권한자체가 필요없어진다는 ... 결론입니다;;; 답변이 많이 돌아왔네요 ㅋㅋ
제가 할때는 권한이 없으면 작동을 안하던데 이상하네요.;;
어쨌튼 말씀해주신 부분을 좀더 확인해 봐야겠습니다.
답변 감사합니다.^^
...