Не удается скачать из Google Play Store, когда VPN-соединение активно - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь реализовать "Изменить логику DNS программно" в моем приложении. Все работает хорошо, но когда я пытаюсь загрузить / обновить приложение через Google Play, оно не начинает прогрессировать без остановки. Когда я прекращаю свою службу, все работает хорошо, и я могу без проблем загружать / обновлять приложения.

Это мой сервис:

public class VPNService extends VpnService {

private VpnService.Builder builder = new VpnService.Builder();
private ParcelFileDescriptor fileDescriptor;
private Thread mThread;
private boolean shouldRun = true;
private DatagramChannel tunnel;

public static final String ACTION_CONNECT       = VPNService.class.getName() + ".START";
public static final String ACTION_DISCONNECT    = VPNService.class.getName() + ".STOP";

@Override
public void onDestroy() {
    if (mThread != null) {
        mThread.interrupt();
    }
    super.onDestroy();
}

@Override
public void onCreate() {
    super.onCreate();

    startForeground(999, new Notification());

}

private void setTunnel(DatagramChannel tunnel) {
    this.tunnel = tunnel;
}

private void setFileDescriptor(ParcelFileDescriptor fileDescriptor) {
    this.fileDescriptor = fileDescriptor;
}

@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
    if (intent != null && ACTION_DISCONNECT.equals(intent.getAction())) {
        onDestroy();
        return Service.START_NOT_STICKY;
    }

    mThread = new Thread(() -> {
        try {
            setFileDescriptor(builder.setSession(VPNService.this.getText(R.string.app_name).toString()).
                    addAddress("192.168.0.1", 24).addDnsServer("94.155.240.3").addDnsServer("212.50.87.211").establish());
            setTunnel(DatagramChannel.open());
            tunnel.connect(new InetSocketAddress("127.0.0.1", 8087));
            protect(tunnel.socket());
            while (shouldRun)
                Thread.sleep(100L);
        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            if (fileDescriptor != null) {
                try {
                    fileDescriptor.close();
                    setFileDescriptor(null);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    });

    mThread.start();

    return Service.START_STICKY;
}

public static void startVService(Context context) {
    VPNService.prepare(context);
    try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            ContextCompat.startForegroundService(context,new Intent(context, VPNService.class).setAction(ACTION_CONNECT));
        else
            context.startService(new Intent(context, VPNService.class).setAction(ACTION_CONNECT));

    }catch (RuntimeException e){
        Log.d("VPNService","Not allowed to start service Intent",e);
    }
}

}

...