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

웹뷰에서 파일업로드 클릭후 파일 선택하지 않고 취소시 문제점

0 추천
다른게 아니라 웹뷰로 업로드 부분을 만들고 있는데

- 4.4.2  킷캣 부분 문제

 버전 체크를 하여 4.4.2 에서는 킷캣으로 처리되게 해놓았는데
 여기서는 이미지 클릭하면 file choose 화면이 뜨는데요 여기서 이미지나 카메라 선택하지 않고
 취소하여도 다시 file choose 화면이 잘 뜹니다. 갤러리에서 파일 선택이나 카메라로 찍은후
 선택후에 이미지 잘올라가고 웹뷰단에서 서버에 파일 업로드도 정상적으로 됩니다.
 그러나 이렇게 한번 정도 파일을 선택후 서버에 파일 업로드 후 앱을 종료후에 다시 접속하면
 file choose 가 안먹히고 먹통이 되버리네요.

- 4.4.2 이하 버전 문제

input file 클릭후 file choose 화면 뜨고 나서 이미지나 카메라 선택하지 않고 바로 취소를 하게 되면

input file이 선택이 안되고 뒤로 가기 input 글자 선택 ~~ 아예 먹통이 되어 버립니다. ㅠ.ㅠ

다시 앱을 종료후에 하얀 바탕 화면만 나오고 실행이 안됩니다.

많은 조언 부탁합니다. 꾸벅 ㅠ.ㅠ

//=============  onResume() 부분과  onRestart() 부분 ====////

구글 검색해서 pauseTimers(), resumeTimers()  넣어주면 된다고 해서 했는데 안되네요 ㅠ.ㅠ

@Override
protected void onPause() {
mWebView.pauseTimers();
super.onPause();
}

@Override
protected void onResume() {
mWebView.resumeTimers();
super.onResume();
}

ps : 혹시 백 버튼이 문제일것 같아서 백 부분도 남깁니다.

@Override   
    public void onBackPressed() {       
    //super.onBackPressed();       
    backPressCloseHandler.onBackPressed();   
    }

///====== BackPressCloseHandler.java

package kr.co.test;

import android.app.Activity;
import android.widget.Toast;

public class BackPressCloseHandler {
private long backKeyPressedTime = 0;
private Toast toast;

private Activity activity;

public BackPressCloseHandler(Activity context) {
this.activity = context;
}

public void onBackPressed() {
if (System.currentTimeMillis() > backKeyPressedTime + 2000) {
backKeyPressedTime = System.currentTimeMillis();
showGuide();
return;
}
if (System.currentTimeMillis() <= backKeyPressedTime + 2000) {
activity.finish();
toast.cancel();
}
}

public void showGuide() {
toast = Toast.makeText(activity, "\'뒤로\'버튼을 한번 더 누르시면 종료됩니다.", Toast.LENGTH_SHORT);
toast.show();
}
}

///======= Main.java

************ 구글링 해보니까 openFileChooser 에서 취소시 처리가 안되서 그런듯 한데
  자바는 완전 초보라서 어떻게 해야 할지 모르겠네요.

OnCancelListener 로 어떻게 해야 할듯한데. 조언 좀 부탁합니다. ㅠ.ㅠ 이것 가지고 일주일째 지금

해매고 있습니다. ㅠ.ㅠ

public class CustomWebChromeClient extends WebChromeClient {
   
    // 페이지 로딩시 프로그래스바 표시
@Override
public void onProgressChanged(WebView view, int progress) {
super.onProgressChanged(view, progress);
mLoadingProgressBar.setProgress(progress);
// 페이지 로딩완료 후 프로그래스바 숨김
if (progress == 100) {
mLoadingProgressBar.setVisibility(View.GONE);
} else {
mLoadingProgressBar.setVisibility(View.VISIBLE);
}
}
   
// 자바스크립트 에러 발생 시 로그 출력부
public boolean onConsoleMessage(ConsoleMessage cm) {
Log.e("raon", cm.message() + " -- From Line " + cm.lineNumber() + "of" + cm.sourceId());
return true;
}
// For Android > 4.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
openFileChooser(uploadMsg);
}
// Andorid 3.0 +
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
openFileChooser(uploadMsg);
}
/**
* 파일 업로드. input tag를 클릭했을 때 호출된다.<br>
* 카메라와 갤러리 리스트를 함께 보여준다.
* @param uploadMsg
*/
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
mUploadMessage = uploadMsg;

File directory = new File(Environment.getExternalStorageDirectory() + File.separator + "test");

if (!directory.exists()) {
directory.mkdir();
}
mTempFile = new File(directory, "photo_" + new Date().getTime() + ".jpg");

            final List<Intent> cameraIntents = new ArrayList<Intent>();
            final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            final PackageManager packageManager = getPackageManager();
            final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
           
            for(ResolveInfo res : listCam) {
                final String packageName = res.activityInfo.packageName;
                final Intent i = new Intent(captureIntent);
                i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                i.setPackage(packageName);
                i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempFile));
                cameraIntents.add(i);

            }

            Intent i = new Intent(Intent.ACTION_GET_CONTENT);
            i.addCategory(Intent.CATEGORY_OPENABLE);
            i.setType("image/*");
            Intent chooserIntent = Intent.createChooser(i,"File Chooser");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
            Main.this.startActivityForResult(chooserIntent,  FILECHOOSER_RESULTCODE);
}
}
Mhope (140 포인트) 님이 2014년 12월 26일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...