2016-03-04 101 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端的字符串,當然。無論如何,您的調用應該與參數的類型和數量的定義相匹配。 –

相關問題