다른게 아니라 웹뷰로 업로드 부분을 만들고 있는데
- 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);
}
}