언어&플랫폼/Android 2015. 6. 12. 10:50



절차 

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

http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object, java.lang.String)


- Javascript interface(WebviewInterface) 사용

http://fimtrus.tistory.com/76


- 파일열기 intent

http://twigstechtips.blogspot.kr/2011/08/android-how-to-select-file.html


- 모바일 agent 구분하기

http://faildev.blogspot.kr/2012/10/javascript-mobile-agent.html





posted by cozyboy
: