2016-03-04 103 views
-1

我被困在我的项目中并请求您的帮助!
我正尝试在MainActivity.java中的webview中调用一个Activity(BarcodeScannerActivity.java),并使用javascript调用按钮单击。我想我搞砸了参数...我不知道我犯了什么错误,我只是复制并修改了博客和计算器中的代码。使用@JavascriptInterface从webview中调用活动

我有在我的Android工作室logcat的这个错误:

[INFO:CONSOLE(315)] "Uncaught Error: Error calling method on NPObject.", source: http:// .........

,这是我的服务器端HTML:

<input type="button" value="Scanner" id="BtnScan" class="btn_dark" onclick="callActivity();" /> 
<script> 
    function callActivity() { 
    Android.openBarcodeScanner(); 
    } 
</script> 

这是我MainActivity.java包含的WebView:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     getSupportActionBar().hide(); 

     //getWindow().requestFeature(Window.FEATURE_ACTION_BAR); 
     //getActionBar().hide(); 

     setContentView(R.layout.activity_main); 

     MainWebView = (WebView) findViewById(R.id.mainWebview); 
     MainWebView.setWebViewClient(new WebViewClient()); 

     //-- add javascript listener 
     MainWebView.addJavascriptInterface(new WebAppInterface(this), "Android"); 
     MainWebView.getSettings().setJavaScriptEnabled(true); 

     MainWebView.loadUrl(WebViewURL); 
    } 

..skipped for brevity.. 

public class WebAppInterface { 
     Context mContext; 

     /** Instantiate the interface and set the context */ 
     WebAppInterface(Context c) { 
      mContext = c; 
     } 

     @JavascriptInterface 
     public void openBarcodeScanner(String str) { 
      Intent barcodeScanIntent = new Intent(mContext, BarcodeScannerActivity.class); 
      mContext.startActivity(barcodeScanIntent); 
     } 
} 

and last,the BarcodeScannerActivity.java tha吨想被称为:

public class BarcodeScannerActivity extends Activity implements View.OnClickListener { 

// private static final R = ; 
    // use a compound button so either checkbox or switch widgets work. 
    private CompoundButton autoFocus; 
    private CompoundButton useFlash; 
    private TextView statusMessage; 
    private TextView barcodeValue; 

    private static final int RC_BARCODE_CAPTURE = 9001; 
    private static final String TAG = "BarcodeMain"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.barcode_scanner); 

     statusMessage = (TextView)findViewById(R.id.status_message); 
     barcodeValue = (TextView)findViewById(R.id.barcode_value); 

     autoFocus = (CompoundButton) findViewById(R.id.auto_focus); 
     useFlash = (CompoundButton) findViewById(R.id.use_flash); 

     findViewById(R.id.read_barcode).setOnClickListener(this); 
    } 

    /** 
    * Called when a view has been clicked. 
    * 
    * @param v The view that was clicked. 
    */ 
    @Override 
    public void onClick(View v) { 
     if (v.getId() == R.id.read_barcode) { 
      // launch barcode activity. 
      Intent intent = new Intent(this, BarcodeCaptureActivity.class); 
      intent.putExtra(BarcodeCaptureActivity.AutoFocus, autoFocus.isChecked()); 
      intent.putExtra(BarcodeCaptureActivity.UseFlash, useFlash.isChecked()); 

      startActivityForResult(intent, RC_BARCODE_CAPTURE); 
     } 

    } 


    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == RC_BARCODE_CAPTURE) { 
      if (resultCode == CommonStatusCodes.SUCCESS) { 
       if (data != null) { 
        Barcode barcode = data.getParcelableExtra(BarcodeCaptureActivity.BarcodeObject); 
        statusMessage.setText(R.string.barcode_success); 
        barcodeValue.setText(barcode.displayValue); 
        Log.d(TAG, "Barcode read: " + barcode.displayValue); 
       } else { 
        statusMessage.setText(R.string.barcode_failure); 
        Log.d(TAG, "No barcode captured, intent data is null"); 
       } 
      } else { 
       statusMessage.setText(String.format(getString(R.string.barcode_error), 
         CommonStatusCodes.getStatusCodeString(resultCode))); 
      } 
     } 
     else { 
      super.onActivityResult(requestCode, resultCode, data); 
     } 
    } 
} 

和最后一个问题是,这个JavaScript代码也会在我的情况下工作吗? 还是我需要修改一下?

function callActivity(){ 

      if(window.android){ 

       console.info("android"); 

       window.android.openBarcodeScanner(number.value);   

      } 

      else{ 

       console.info("web"); 

       document.form.submit(); 

      } 

     } 

    } 

非常感谢您的提前!

回答

1

你的接口需要一个字符串作为参数:

@JavascriptInterface 
public void openBarcodeScanner(String str) { 

但是你的调用不会传递任何参数:

Android.openBarcodeScanner(); 
+0

感谢您的评论@Doug!我想将扫描的条形码数据(例如:078742353098)传递给客户端的按钮。我应该在括号之间写什么参数?它是Android.openBarcodeScanner(barcode.displayValue); ? –

+0

无论你想从JavaScript端发送到Java端的字符串,当然。无论如何,您的调用应该与参数的类型和数量的定义相匹配。 –

相关问题