Android VpnService.Builder.establish() sporadically null



当我尝试为我的VPN服务创建隧道接口时,出现以下错误:

Attempt to invoke virtual method 'java.lang.String android.os.ParcelFileDescriptor.toString()' on a null object reference

我目前唯一的解决方法是在发生这种情况时重新启动设备。如果我不这样做,我根本无法创建隧道。

我创建隧道的代码:

// This is inside my VpnService implementation 
private ParcelFileDescriptor configureTunnelWithPushOpts(PushOpts popts)
{
VpnService.Builder builder = this.new Builder();
builder.setMtu       ( currentServerPrefs.SERVER_MTU );
builder.addAddress   ( popts.ip, 32                  );
builder.addDnsServer ( popts.dns1                    );
builder.addDnsServer ( popts.dns2                    );
builder.addRoute     ( "0.0.0.0", 0                  );

// Note: Blocking mode is now enabled in native
// code under the setFileDescriptor function.
// builder.setBlocking(true);
builder.setConfigureIntent(
PendingIntent.getActivity(
this,
0,
new Intent(
this,
MainActivity.class
),
PendingIntent.FLAG_UPDATE_CURRENT)
);
final ParcelFileDescriptor vpnInterface;
synchronized (this) {
builder.setSession(currentServerPrefs.SERVER_ADDRESS);
vpnInterface = builder.establish();
}
Logger.info("New interface: " + vpnInterface.toString(), this);
return vpnInterface;
}

编辑:

根据文档,如果尚未准备 VpnService,establish函数将返回null,但是我在运行上述函数之前使用它来准备它。

// This is inside my MainActivity class
Intent intent = VpnService.prepare(getApplicationContext());
if (intent != null) {
startActivityForResult(intent, 0);
} else {
onActivityResult(0, RESULT_OK, null);
}
. . . 
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
Intent intent = new Intent(this, MyVpnService.class);
startService(intent);
}
}

我用于调试的电话

Google Nexus 5 Running Android 5.0.1

编辑

我想出了如何复制它,使其不再零星。 基本上,如果我在连接VPN时卸载应用程序,然后重新安装并尝试启动它,则在运行builder.establish()时会收到空响应。我担心当通过Google Play商店更新应用程序时,这可能会带来潜在的问题。

除此之外,请不要将此问题标记为重复。关于这个问题的所有其他问题都得到了答案,即在建立构建器之前需要准备服务,但是我正在准备它,并且对我的问题有不同的原因。任何帮助将不胜感激。

非常感谢您的提示,它为我带来了解决方案!

我在Android 5.0.2中遇到了同样的问题:一切正常,我安装了我正在开发的VPN应用程序。第二天,突然,一个无法解决的NullPointerException,尽管prepare被正确地调用了。

可以通过以下步骤在我的环境中解决此问题:

  • 卸载应用程序。没关系,该应用程序是否仍然具有有效的VPN功能。
  • 重新启动手机。确保它已完全关闭。
  • 重新启动后,
  • 请确保不再安装该应用程序(我遇到了一些奇怪的开发问题,在重新启动手机后重新安装了应用程序(。
  • 再次安装 VPN 应用。它现在应该收到一个 vpn 接口,而不是null.

相关内容

  • 没有找到相关文章

最新更新