안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요.
이번에 어플을 테스트하며 개발을 해보고있는 학생입니다.
어플에 webview를 통해 결제모듈을 불러와 결제하는 방법을 테스트 중인데
오류가 발생하는것도 아니고 결제모듈이 뜨기전까지는 또 백키가 먹히나 결제모듈을 불러오면 백키가 먹히질 않습니다.
webview에서 백키를 구현하는 부분에 로그켓을 두고 봐도 백키는 입력이 되는데 제 성능을 내지 못하는거 같습니다.........
해결방법이 있을까요?
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
String url = "-------------------------------------------";
String postData = "";
mWebView.postUrl("url ,EncodingUtils.getBytes(postData, "BASE64"));
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new CustomScheme());
mWebView.setWebChromeClient(new WebChromeClient(){
@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result){
new AlertDialog.Builder(GalleryExample.this)
.setTitle("경고")
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new AlertDialog.OnClickListener(){
public void onClick(DialogInterface dialog, int which){
result.confirm();
}
})
.setCancelable(false)
.create()
.show();
return true;
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
private class CustomScheme extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(url.endsWith(".apk")){
downloadFile(url);
return super.shouldOverrideUrlLoading(view, url);
} else if (url.startsWith("http:") || url.startsWith("https:")) {
view.loadUrl("url);
} else {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
try {
startActivity(intent);
} catch (ActivityNotFoundException ex) {
return false;
}
}
return true;
}
/* public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
int keyCode = event.getKeyCode();
if ((keyCode == KeyEvent.KEYCODE_DPAD_LEFT) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
} else if ((keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) && mWebView.canGoForward()) {
mWebView.goForward();
return true;
}
return false;
}*/
private void downloadFile(String fileUrl){
URL myFileUrl =null;
try {
myFileUrl= new URL("fileUrl);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
// 다운 받는 파일의 경로는 sdcard/ 에 저장되며 sdcard에 접근하려면 uses-permission에 android.permission.WRITE_EXTERNAL_STORAGE을 추가해야만 가능.
String mPath = "sdcard/v3mobile.apk";
FileOutputStream fos;
File f = new File(mPath);
if ( f.createNewFile() ) {
fos = new FileOutputStream(mPath);
int read;
while ( (read = is.read()) != -1) {
fos.write(read);
}
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(getApplicationContext(), "download complete", 0).show();
// 안드로이드 패키지 매니저를 사용한 어플리케이션 설치.
File apkFile = new File(Environment.getExternalStorageDirectory()+ "/v3mobile.apk");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType( Uri.fromFile(apkFile), "application/vnd.android.package-archive");
startActivity(intent);
}
}
}



자답입니다. 백키구현시 평소에는 잘되는데 특정상황(결제모듈,페이스북접속)시 뒤로가기키가 먹통되는 현상이 있는데
그경우 아래 소스를 넣어주시면 잘됩니다. WebViewClient 클래스에
@Override
public void onFormResubmission(WebView view, Message dontResend, Message resend) {
resend.sendToTarget();
}
추가해주시면 잘됩니다.