반응형
이번에는 안드로이드 Webview를 이용하여 작업하다 보면 웹뷰내의 파일첨부 기능을 만날때가 있다.
그럴경우 사용하는 코드이다. 물론 이경우는 구글에서 제공해주는 방식이다. 하지만 여기에 문제가 있다면
하위버전을 다 테스트 해본건 아니지만...높은 버전은 아주 잘되지만...4.4.2버전의 경우는 코드가 먹질않는다.
그래서 낮은 버전까지 다 기능을 지원해줘야 한다면...직접 뷰를 그려서 작업하는 방식이 제일 좋을듯하다...
1. 웹뷰 WebChromeClient에 코드를 넣어준다.
mWebview.setWebChromeClient(new WebChromeClient(){ // 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(TYPE_IMAGE); startActivityForResult(intent, INPUT_FILE_REQUEST_CODE); } // For 3.0 <= Android Version < 4.1 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { Log.e(TAG, "openFileChooser 2222" ); openFileChooser(uploadMsg, acceptType, ""); } // For Android 4.1+ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { Log.e(TAG, "4.1+"); openFileChooser(uploadMsg, acceptType); } // For Android 5.0+ public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> uploadFile, WebChromeClient.FileChooserParams fileChooserParams) { if(mFilePathCallback !=null) { mFilePathCallback.onReceiveValue(null); mFilePathCallback = null; } mFilePathCallback = uploadFile; Intent i =new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); startActivityForResult(Intent.createChooser(i, "File Chooser"), INPUT_FILE_REQUEST_CODE); return true; } private void imageChooser() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(mContext.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 Log.e(getClass().getName(), "Unable to create Image File", ex); } // 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(TYPE_IMAGE); 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, "Image Chooser"); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); startActivityForResult(chooserIntent, INPUT_FILE_REQUEST_CODE); } });
2. 사용하는 변수와 startActivityForResult 로 갔다왔을때의 처리
//변수 private static final String TYPE_IMAGE = "image/*"; private static final int INPUT_FILE_REQUEST_CODE = 1; private ValueCallback<Uri> mUploadMessage; private ValueCallback<Uri[]> mFilePathCallback; private String mCameraPhotoPath; private File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); File imageFile = File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); return imageFile; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == INPUT_FILE_REQUEST_CODE) { if(resultCode == Activity.RESULT_OK){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (mFilePathCallback == null) { super.onActivityResult(requestCode, resultCode, data); return; } Uri[] results = new Uri[]{getResultUri(data)}; mFilePathCallback.onReceiveValue(results); mFilePathCallback = null; } else { if (mUploadMessage == null) { super.onActivityResult(requestCode, resultCode, data); return; } Uri result = getResultUri(data); Log.d(getClass().getName(), "openFileChooser : "+result); mUploadMessage.onReceiveValue(result); mUploadMessage = null; } }else { if (mFilePathCallback != null) mFilePathCallback.onReceiveValue(null); if (mUploadMessage != null) mUploadMessage.onReceiveValue(null); mFilePathCallback = null; mUploadMessage = null; super.onActivityResult(requestCode, resultCode, data); } }
반응형
'프로그램 > Android' 카테고리의 다른 글
안드로이드 java.lang.SecurityException 에러 (0) | 2017.08.28 |
---|---|
APK에서 개인정보처리 방침이 필요한 권한을 사용합니다. (0) | 2017.08.28 |
안드로이드 mp3파일 전화벨소리 지정 (0) | 2017.08.28 |
전화번호부에서 전화번호 긁어오기 (0) | 2017.08.28 |
안드로이드 Notification 이미지와 큰사이즈 (0) | 2017.08.28 |