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

웹뷰에서 카메라 실행.

글쓴이 : 한신IT타워 날짜 : 2018-02-01 (목) 16:09 조회 : 461
글주소 : http://www.androidside.com/B49/169264
 
  앱 고정 매출은 노티플러스
앱 광고수익이 고민이라면 노티플러스로 해결하세요. NO클릭,NO설치,고정수익YES
notiplus.co.kr
  각성 판타지! 보스온라인
하드캐리의 정석! 화려한 풀3D 액션과 다양한 전직으로 보스전을 캐리하라!
boss.noblegames.kr
  용의군단의 이름으로 승리하라
전쟁에 미친 군단의 이름으로 가즈아! 2018년 준비된 3D 고퀄리티 RPG!
ys.topgame.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 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기