절차
1. 웹뷰 인터페이스 만들기
2. webview에서 intent를 활용해 파일 선택하여 경로 얻기
3. javascript에서 android 함수 호출하기(하이브리드앱-웹뷰와 모바일 브라우저 구분해서 호출)
안드로이드 샘플 코드 -> 웹서버 샘플 코드
안드로이드 샘플 코드
package com.example.i.test1;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Toast;
public class MainActivity extends Activity {
private WebView mWebView;
private WebViewInterface mWebViewInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.activity_main_webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new MyAppWebBiewClient());
mWebViewInterface = new WebViewInterface(MainActivity.this, mWebView); //JavascriptInterface 객체화
mWebView.addJavascriptInterface(mWebViewInterface, "Android"); //웹뷰에 JavascriptInterface를 설정//인자로는 인터페이스 객체와, javascript에서 사용될 객체이름(window.Android)
mWebView.loadUrl("http://내 웹서버/");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if(mWebView.canGoBack()){
mWebView.goBack();
}else{
super.onBackPressed();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode) {
case 1: {
if (resultCode == RESULT_OK){
Uri uri = data.getData();
String filePath = uri.getPath();
Toast.makeText(this, filePath, Toast.LENGTH_LONG).show(); //intent data로 받은 파일 경로를 출력
}
}
}
}
public class WebViewInterface extends Activity {
private WebView mAppView;
private Activity mContext;
/**
* 생성자.
* @param activity : context
* @param view : 적용될 웹뷰
*/
public WebViewInterface(Activity activity, WebView view) {
mAppView = view;
mContext = activity;
}
/**
* 안드로이드 토스트를 출력한다. Time Long.
* @param message : 메시지*/
@JavascriptInterface
public void toastLong (String message) {
Toast.makeText(mContext, message, Toast.LENGTH_LONG).show();
Intent chooseFile;
Intent intent;
chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
chooseFile.setType("file/*");
intent = Intent.createChooser(chooseFile, "Choose a file");
mContext.startActivityForResult(intent, 1);
//파일을 오픈할 앱을 선택->파일선택->파일경로 data에 넣고 resultData에 넣어주기
}
/**
* 안드로이드 토스트를 출력한다. Time Short.
* @param message : 메시지
*/
@JavascriptInterface
public void toastShort (String message) { // Show toast for a short time
Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
}
}
}
웹서버 샘플 코드
var mobileKeyWords = new Array('iPhone', 'iPod', 'BlackBerry', 'Android', 'Windows CE', 'LG', 'MOT', 'SAMSUNG', 'SonyEricsson');
//모바일인지 체크
for (var word in mobileKeyWords){
if (navigator.userAgent.match(mobileKeyWords[word]) != null){
// 모바일 작업a
if(window.Android != null)
window.Android.toastLong( "JavscriptInterface Test" );
//안드로이드 webviewInterface 사용부분
break;
}
}
위에서 window.Andriod의 null 체크를 하는 이유는, 웹뷰를 사용한 하이브리드 앱과 모바일 브라우져에서 접속했을때를 구분하기 위해서이다. null 체크를 하지 않는다면 모바일 브라우져에서 페이지를 직접 열때 스크립트 오류가 발생할 것이다.
참고
- webView DOC
http://developer.android.com/reference/android/webkit/WebView.html
-webView Code
http://arabiannight.tistory.com/54
http://tjandroid.blogspot.kr/2013/02/webview.html
- addJavaInterface DOC
- Javascript interface(WebviewInterface) 사용
- 파일열기 intent
http://twigstechtips.blogspot.kr/2011/08/android-how-to-select-file.html
- 모바일 agent 구분하기
http://faildev.blogspot.kr/2012/10/javascript-mobile-agent.html
'언어&플랫폼 > Android' 카테고리의 다른 글
webview javascript 함수 실행 (0) | 2015.10.15 |
---|---|
[android] 롤리팝 - was loaded over HTTPS, but is submitting data to an insecure location at (0) | 2015.06.29 |
[android] gcm push 테스트 코드 (0) | 2015.06.18 |
android studio 단축키 (0) | 2015.06.12 |