총 게시물 39,162건, 최근 3 건 안내 RSS 글쓰기
이전글  다음글  목록 글쓰기
[안드로이드]

웹뷰에서 카메라 실행.

글쓴이 : 한신IT타워 날짜 : 2018-02-01 (목) 16:09 조회 : 2386
글주소 : http://www.androidside.com/B49/169264
 
  4DView
3D Web Cloud Services, 3D촬영, 3D홈페이지 - 4DView
www.4dwel.com
  쿠쿠닥스 HTML5 통합뷰어
Non-ActiveX 기반의 HTML5 문서뷰어 office, pdf, hwp
www.kukudocs.com/
  정통 MMORPG 데몬온라인
카우방에서 렙업하고 메피잡아서 조던링 먹던 그 재미! 이제 웹에서 즐기세요!
dm.noblegames.kr
신청하기


안드로이드, 자바 그리고 다양한 질문에 대해 성실히 답해드립니다. Q&A Jang

안녕하세요

웹뷰에서 앨범 호출은 해봤는데 카메라 실행도 가능한가요?

웹뷰 만드는 웹개발자가 그거는 일반 브라우저에서 띄우는 모바일웹은 되지만 앱웹에서는 안된다며

자바스크립트로 호출을 해줄테니 너가 카메라를 띄워서 사진을 찍고 사진을 파싱하거나 뭐 경로를 가져와서

API 로 자기에게 보내달라는 소리를 하는데요..

카메라 호출이 안되나요?

제 크롬클라이언트 안에 있는 소스입니다..

       // For Android Version < 3.0
        public void openFileChooser(ValueCallback<Uri> uploadMsg) {
            //System.out.println("WebViewActivity OS Version : " + Build.VERSION.SDK_INT + "\t openFC(VCU), n=1");
            mUploadMessage = uploadMsg;
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            intent.setType("video/*, image/*");
            startActivityForResult(intent, INPUT_FILE_REQUEST_CODE);
        }

        // For 3.0 <= Android Version < 4.1
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
            openFileChooser(uploadMsg, acceptType, "");
        }

        // For 4.1 <= Android Version < 5.0
        public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture) {
            mUploadMessage = uploadFile;
            imageChooser();
        }

        // For Android Version 5.0+
        // Ref: https://github.com/GoogleChrome/chromium-webview-samples/blob/master/input-file-example/app/src/main/java/inputfilesample/android/chrome/google/com/inputfilesample/MainFragment.java
        public boolean onShowFileChooser(WebView webView,
                                         ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
            if (mFilePathCallback != null) {
                mFilePathCallback.onReceiveValue(null);
            }
            mFilePathCallback = filePathCallback;
            imageChooser();
            return true;
        }

        private void imageChooser() {
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                // Create the File where the photo should go
                File photoFile = null;
                try {
                    photoFile = createImageFile();
                    takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath);
                } catch (IOException ex) {
                    // Error occurred while creating the File
                }

                // Continue only if the File was successfully created
                if (photoFile != null) {
                    mCameraPhotoPath = "file:" + photoFile.getAbsolutePath();
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                            Uri.fromFile(photoFile));
                } else {
                    takePictureIntent = null;
                }
            }

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

//            Intent[] intentArray;
//            if (takePictureIntent != null) {
//                intentArray = new Intent[]{takePictureIntent};
//            } else {
//                intentArray = new Intent[0];
//            }
//
//            Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
//            chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
//            chooserIntent.putExtra(Intent.EXTRA_TITLE, "뭐라고 쓰지?");
//            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);

            startActivityForResult(contentSelectionIntent, INPUT_FILE_REQUEST_CODE);
        }


웹에서는 <input type="file" accept="image/*" capture="camera"/>

이렇게 호출한다고 하구요..

당연히 저장소나 카메라 퍼미션은 다 줬습니다

조언좀 해주세요 짜증나네요 ㅠㅠ



김윤승
질문자가 자신의 포인트 10 점을 걸었습니다.
답변하시면 포인트 2을, 답변이 채택되면 포인트 8을 드립니다.

질문답변 게시판에서 궁금한 사항을 해결하셨다면, 애써 답변해주신 분께 잘 되었다고 따뜻한 댓글 한마디 남겨주세요.
그리고 답변해주신 분의 글을 '추천' 해주세요.
추천받으신 분에게 1포인트가, 추천하신 분에게도 1포인트가 적립됩니다. ^^

OSKiller 2018-02-01 (목) 17:00
됩니다
다보진 않았지만 대충 저렇게하는거 맞습니다
카메라로 사진 찍어서 가져온 데이타를 콜백객체에 잘 넣어 주면 됩니다
참고로 4.4.2에서는 저방법으로 안됩니다
댓글주소 추천 0 반대 0
     
     
한신IT타워 2018-02-02 (금) 15:30
[@OSKiller]

자바스크립트 인터페이스로 뭔가를 받아서 제가 네이티브로 카메라를 띄운 후에 사진을 찍고 그 사진을 어쩌구 보내주지 않아도 된단 말씀이시죠?

앨범띄우는 예제는 많은데 사진촬영은 없네요 ㅠ
댓글주소 추천 0 반대 0
에찌 2018-02-02 (금) 13:58
브릿지로 연결해서 카메라 연결해라고 하면 그때 카메라 켜서 찍고 콜백된 데이터를 파싱해서 다시 웹쪽에 전달해주면안되나요?
댓글주소 추천 0 반대 0
     
     
한신IT타워 2018-02-02 (금) 15:31
[@에찌]

웹만드시는분이 그렇게 하자고해서 제가 지금 꼭 그렇게 해야하냐고 질문을 올린겁니다 ㅠ
댓글주소 추천 0 반대 0
          
          
에찌 2018-02-02 (금) 15:36
[@한신IT타워]
카메라 찍고 가져와야할 데이터는 결국 하이브리드 앱이라면 앱개발자분께서 하시는게 깔끔하실텐데여....
안드로이드 버전상 문제도 있고 해서..

그런데 어짜피 데이터파싱은 해야하니 그 파싱된 데이터만 넘겨주면 되지않나요?

예로들어서 웹뷰 게시판에 사진을 올리고 싶다거나 그럴때 앱에서 카메라 켜서 바로 사진올리게끔 해준다면은.. 
카메라 요청 확인 후 카메라 퍼미션 확인 그리고 나서 사진찍으면 콜백으로 데이터 확인해서 필요부분만 필터링 해서 가져오고 그걸 자바스크립트로 전달.

흠... 머.. 선택은 본인이 하시는거라..ㅎ
댓글주소 추천 0 반대 0
OSKiller 2018-02-02 (금) 15:56
지금 보니 인풋을 클릭 하면 엘범을 선택 하도록 해두었네요
takePictureIntent 가 카메라로 찍는 인텐트 입니다
주석으로 막아 두신부분에서 intentArray에 인텐트 두개를 넣어서 
chooserIntent를 호출 하면 카메라, 엘범을 선택 하도록 할수 있습니다

댓글주소 추천 0 반대 0
뉴키 2018-02-06 (화) 09:22
그놈의 4.4.2때문에 저도 개고생을...

4.4.2는 또 사용자도 많아요..-_- 제가 삽질할때보다 줄어들긴 했지만 아직도 킷캣은 12%대가 사용중이네요.
댓글주소 추천 0 반대 0
이전글  다음글  목록 글쓰기

 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기