首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android VpnService.Builder.establish()偶尔为空

Android VpnService.Builder.establish()偶尔为空
EN

Stack Overflow用户
提问于 2017-07-22 17:39:23
回答 1查看 2.1K关注 0票数 6

当我试图为我的VpnService创建隧道接口时,我会得到以下错误:

代码语言:javascript
复制
Attempt to invoke virtual method 'java.lang.String android.os.ParcelFileDescriptor.toString()' on a null object reference

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

我创建隧道的代码:

代码语言:javascript
复制
// 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;
}

编辑:

根据文档,如果还没有准备好establish函数,那么null函数将返回VpnService,但是在运行上面的函数之前,我将使用它来准备。

代码语言:javascript
复制
// 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更新时,我担心这可能会带来潜在的问题。 除此之外,请不要将此问题标记为重复。有关这件事的每一个其他问题都得到了答复,即在建造者建立之前,服务需要准备好,但我正在为我的情况做准备,对我的问题有不同的原因。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-04-14 16:34:37

非常感谢你的暗示,它让我找到了解决方案!

我在Android5.0.2中也遇到了同样的问题:一切正常,我安装了我正在开发的vpn应用程序。第二天,突然间,一个无法解决的NullPointerException被正确地调用了prepare

这个问题可以通过以下步骤在我的环境中得到解决:

  • 卸载应用程序。这并不重要,如果应用程序仍然有工作的VPN功能是否。
  • 重启你的手机。确保它被完全关闭了。
  • 重新启动后,确保应用程序不再安装(我有一些奇怪的开发问题,其中一个应用程序是重新安装后,我的手机)。
  • 再次安装您的VPN应用。它现在应该接收一个vpn接口,而不再是null
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45257457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档