我将一个移动网站(通过网络)打包在PhoneGap中,并希望拦截某些链接并使用ChildBrowser插件打开它们。是否可以从 native 代码触发ChildBrowser(我已经确定要拦截的链接)

我试过下面的代码,但它会导致NULLPointerException:

ChildBrowser childBrowser = new ChildBrowser();
childBrowser.openExternal(url, true);

异常详细信息:
07-29 10:49:52.632      947-947/com.abc.androidTablet E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NullPointerException
at com.phonegap.plugins.childBrowser.ChildBrowser.openExternal(ChildBrowser.java:127)
at com.mygola.androidTablet.abc_android$1.shouldOverrideUrlLoading(abc_android.java:96)
at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:270)
at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:372)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)

最佳答案

没有您的logcat,很难使用该插件给您进一步的建议,但是如果您从 native 层调用openExternal,则没有理由使用该插件。如果您查看the source code,您会看到它所做的全部就是获取您的网址并将其加载到新的DroidGap页面中。

如果仅采取必要的措施,则可能有助于跟踪异常发生的位置。

function void openExternalUrl() {

  intent = new Intent().setClass(this.ctx.getContext(), org.apache.cordova.DroidGap.class);
  intent.setData(Uri.parse(url)); // This line will be removed in future.
  intent.putExtra("url", url);
  this.ctx.startActivity(intent);

 }

编辑

您在上下文变量上得到了一个null异常。我不知道为什么它当时为null,但是您可以轻松地修改该方法并传递当前上下文。用上下文替换this.cordova,您应该可以。从您的 Activity 中调用此命令,将this用作最后一个参数(ex: childBrowser.openExternal("http://www.google.com", true,this))
public String openExternal(String url, boolean usePhoneGap,Context context) {
   ...
  intent = new Intent().setClass(context, org.apache.cordova.DroidGap.class);
   ...
  context.startActivity(intent);
  }

另外,为防止其他人对此函数的调用引起错误,请使用原始参数添加另一个方法:
public String openExternal(String url, boolean usePhoneGap) {
   openExternal(url,usePhoneGap,this.cordova.getActivity());
}

10-08 12:21