PhoneGap / Android,从.shouldOverrideUrlLoading()打开ChildBrowser

时间:2013-07-29 06:30:56

标签: android cordova phonegap-plugins childbrowser

我在PhoneGap中打包一个移动网站(通过网络),想拦截某些链接并使用ChildBrowser插件打开它们。是否可以从本机代码触发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)

2 个答案:

答案 0 :(得分:1)

如果没有你的logcat,使用插件很难给你进一步的建议,但如果你从本机层调用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替换为上下文,您应该没问题。在您的活动中将此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()); 
}

答案 1 :(得分:1)

下面的代码最终为我工作......

ChildBrowser childBrowser = new ChildBrowser();
childBrowser.cordova = this;
childBrowser.showWebPage(url, null);