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

스캔값 가져온후 자바스크립트로 네이티브구현중

0 추천


public class MainActivity extends Activity {

    private WebView webView;
    public static String sData="";

    @SuppressLint("JavascriptInterface")
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView webView = (WebView) findViewById(R.id.webView1);
        webView.setWebViewClient((new WebViewClient()));
        WebSettings webSettings = webView.getSettings();
        webView.getSettings().setSupportMultipleWindows(false);

        webSettings.setJavaScriptEnabled(true);
        webView.addJavascriptInterface(new JavaScriptInterface(this), "android");
        webView.requestFocus();           
        webView.loadUrl(http://--/mweb/sd_test.php);

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        try{
            if (requestCode == 0) {
                if (resultCode == RESULT_OK) {
                    String sData=data.getStringExtra("SCAN_RESULT");
                    String strJavaScript = "getScan('"+sData+"')"; //스크립트 함수에 매개변수를 넣는다.
                    webView.loadUrl("javascript:"+strJavaScript);
                }
            }
        }catch (Exception e) {
            // TODO: handle exception
            Log.i("err:",e.toString());
        }
    }


    public class JavaScriptInterface {
        Context mContext;

        JavaScriptInterface(Context c)  {
            mContext = c;
        }

        @JavascriptInterface
        public void openScan() { //web에서 자바스크립트로호출
            Intent intentScan = new Intent("com.google.zxing.client.android.SCAN");
            intentScan.setPackage("com.google.zxing.client.android");
            startActivityForResult(intentScan,0);
        }

        @JavascriptInterface
        public void showToast(String toast) {
            Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
        }
        @JavascriptInterface
        public void scanJS(String getData) {
            Toast.makeText(mContext, getData, Toast.LENGTH_SHORT).show();
            //scanCode();
        }

    }

 

    class WebClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }


}

 

웹뷰로 sd_test.php파일을 불러온후 페이지내 스캐너버튼클릭->openScan()함수가 호출되어

안드로이드에서 스캐너구동->스캔값을 가져와서 다시 sd_test.php파일에 함수를통해 보내려고 합니다.

현재 onActivityResult 에서 sData값까지 가져오는건 확인했습니다. 그다음

 webView.loadUrl("javascript:"+strJavaScript);
이렇게 호출하면 안되는데...제가 잘못구현을 한건가봅니다..
아직 안드로이드한지가 얼마안되서...모르는게 많구요..ㅠ
비동기식 네이티브방식이 따로있는지.. 방법을 계속 구글링하는데 갈피를 못잡습니다. 조언좀 주세요
익명사용자 님이 2016년 10월 17일 질문

1개의 답변

0 추천

일단 webView.loadUrl("javascript:"+strJavaScript); 이부분을 webView.loadUrl("javascript:alert(1)"); 로 바꾸어서 테스트 해보세요 동작한다면 호출자체가 문제가 있는건 아니기 때문에 변수 파라메터 형식만 바꿔보시면 될것 같습니다.

만약에 동작하지 않는다면 webView.evaluateJavascript("") 로 변경해서 해보세요..

그리고 기본적으로 webView.setJavaScriptEnabled(true)는 되어 있으시죠?

라쎄린드 (25,460 포인트) 님이 2016년 10월 17일 답변
웹뷰부분이 동작하지않습니다.
webView.setJavaScriptEnabled(true) 도 물론 체크했구요..

오류가 이렇게 뜨네요...ㅠㅠ
 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.webkit.WebView.loadUrl(java.lang.String)' on a null object reference
...