Код: Выделить всё
OpenVPNThread Got java.lang.NullPointerException: Attempt to invoke virtual method 'void java.lang.Process.destroy()' on a null object reference.
Код: Выделить всё
public class HomeActivity extends AppCompatActivity {
private DrawerLayout drawerLayout;
private LinearLayout navView;
private ImageView drawerButton;
private LinearLayout serverButton;
private RecyclerView recyclerView;
ImageView countryFlag;
TextView countryName;
TextView countryIP;
Dialog dialog;
ImageView vpnButton;
TextView statusText, ipText;
boolean isVpnConnected = false;
SharedPreferences sharedPreferences;
private ArrayList serverArrayList = new ArrayList();
HashMap selectedServer = new HashMap();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
drawerLayout = findViewById(R.id.drawerLayout);
navView = findViewById(R.id.navView);
drawerButton = findViewById(R.id.drawerButton);
serverButton = findViewById(R.id.serverButton);
countryFlag = findViewById(R.id.countryFlag);
countryName = findViewById(R.id.countryName);
countryIP = findViewById(R.id.countryIP);
vpnButton = findViewById(R.id.vpnButton);
statusText = findViewById(R.id.statusText);
ipText = findViewById(R.id.ipText);
sharedPreferences = this.getSharedPreferences("ServerDetails", Activity.MODE_PRIVATE);
setupDrawer();
loadServers();
loadSavedServer();
drawerButton.setOnClickListener(v -> drawerLayout.openDrawer(GravityCompat.START));
serverButton.setOnClickListener(v -> showServerLayout());
vpnButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (selectedServer != null && selectedServer.size() !=0){
prepareVPN(selectedServer);
}else {
Toast.makeText(HomeActivity.this, "Please Select Server", Toast.LENGTH_SHORT).show();
}
}
});
}
private void loadSavedServer () {
String serverData = sharedPreferences.getString("savedServer", "");
if (serverData.equals("") || serverData.length() < 10){
return;
}
HashMap hashMap = new Gson().fromJson(serverData, new TypeToken(){}.getType());
selectServer(hashMap);
}
private void showServerLayout() {
dialog = new Dialog(this, android.R.style.Theme_Black_NoTitleBar);
View view = getLayoutInflater().inflate(R.layout.server_layout, null);
dialog.setContentView(view);
recyclerView = view.findViewById(R.id.recyclerView);
ImageView backButton = view.findViewById(R.id.backButton);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new ServerRecyclerAdapter(serverArrayList));
backButton.setOnClickListener(v -> dialog.dismiss());
dialog.show();
}
private void openUrl(String url) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
}
private void loadServers() {
Servers servers = new Servers();
servers.loadServers(new Servers.ServerLoadListener() {
@SuppressLint("NotifyDataSetChanged")
@Override
public void onServerLoaded(HashMap hashMap) {
if (!serverArrayList.contains(hashMap)) {
serverArrayList.add(hashMap);
runOnUiThread(() -> {
if (recyclerView != null && recyclerView.getAdapter() != null) {
recyclerView.getAdapter().notifyDataSetChanged();
}
if (serverArrayList.size() == 1){
selectServer(hashMap);
}
});
}
}
@Override
public void onServerLoadFailed(String message) {
runOnUiThread(() -> Toast.makeText(HomeActivity.this, "Server not loaded because: " + message, Toast.LENGTH_SHORT).show());
}
});
}
private void selectServer(HashMap hashMap){
selectedServer = hashMap;
countryName.setText(hashMap.get("countryLong").toString());
countryIP.setText(hashMap.get("ipAdress").toString());
Glide.with(HomeActivity.this).load("vpngate.net/images/flags/24/" + hashMap.get("countryShort").toString() + ".png").into(countryFlag);
sharedPreferences.edit().putString("SavedServer", new Gson().toJson(hashMap)).apply();
if (dialog !=null) {
dialog.dismiss();
}
}
private void prepareVPN(HashMap hashMap){
String oConfigData = hashMap.get("oConfigData") != null ? hashMap.get("oConfigData").toString() : null;
if (oConfigData == null || oConfigData.isEmpty()) {
Toast.makeText(HomeActivity.this, "Please Select a Valid Server with Configuration", Toast.LENGTH_SHORT).show();
return;
}
Intent intent = VpnService.prepare(HomeActivity.this);
if (intent != null) {
vpnResult.launch(intent);
} else {
connectVPN(hashMap);
}
}
private void connectVPN(HashMap hashMap) {
try {
OpenVpnApi.startVpn(this, hashMap.get("oConfigData").toString(), hashMap.get("countryShort").toString(), "vpn", "vpn");
ipText.setText("IP : " + hashMap.get("ipAdress").toString());
} catch (RemoteException e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
private ActivityResultLauncher vpnResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == Activity.RESULT_OK){
connectVPN(selectedServer);
}else {
Toast.makeText(HomeActivity.this, "Permission must be granted", Toast.LENGTH_SHORT).show();
}
}
});
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
statusText.setText("STATUS : " + intent.getStringExtra("state"));
}
});
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
public class ServerRecyclerAdapter extends RecyclerView.Adapter {
private final ArrayList _data;
public ServerRecyclerAdapter(ArrayList arrayList) {
this._data = arrayList;
}
@NonNull
@Override
public ServerRecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.server_adapter, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ServerRecyclerAdapter.ViewHolder _holder, @SuppressLint("RecyclerView") final int _position) {
// Sunucu verisini holder ile doldurun
View view = _holder.itemView;
ImageView countryFlag = view.findViewById(R.id.countryFlag);
TextView countryName = view.findViewById(R.id.countryName);
TextView countryIP = view.findViewById(R.id.countryIP);
TextView speed = view.findViewById(R.id.speed);
LinearLayout serverLayout = view.findViewById(R.id.serverLayout);
countryName.setText(_data.get(_position).get("countryLong").toString());
countryIP.setText(_data.get(_position).get("ipAdress").toString());
speed.setText(_data.get(_position).get("speed").toString());
Glide.with(HomeActivity.this).load("https://www.vpngate.net/images/flags/24/" + _data.get(_position).get("countryShort").toString() + ".png").into(countryFlag);
serverLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectServer(_data.get(_position));
}
});
}
@Override
public int getItemCount() {
return _data.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}
@Override
protected void onResume(){
super.onResume();
IntentFilter intentFilter = new IntentFilter("connectionState");
LocalBroadcastManager.getInstance(HomeActivity.this).registerReceiver(broadcastReceiver, intentFilter);
}
}
Код: Выделить всё
public class Servers {
private Call mCall;
public Servers() {
// Boş yapıcı metot
}
public void loadServers(ServerLoadListener serverLoadListener) {
Request request = new Request.Builder().url("http://www.vpngate.net/api/iphone/").build();
mCall = new OkHttpClient().newCall(request);
mCall.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
serverLoadListener.onServerLoadFailed(e.getMessage());
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
if (response.isSuccessful()) {
parseResponse(response, serverLoadListener);
} else {
serverLoadListener.onServerLoadFailed("Server response error: " + response.code());
}
}
});
}
private void parseResponse(Response response, ServerLoadListener serverLoadListener) {
try (InputStream inputStream = response.body().byteStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
String data;
while ((data = bufferedReader.readLine()) != null) {
if (!data.startsWith("*") && !data.startsWith("#")) {
loadServerData(serverLoadListener, data);
}
}
} catch (IOException e) {
serverLoadListener.onServerLoadFailed(e.getMessage());
}
}
private void loadServerData(ServerLoadListener serverLoadListener, String data) {
HashMap hashMap = new HashMap();
String[] serverData = data.split(",");
hashMap.put("hostName", serverData[0]);
hashMap.put("ipAdress", serverData[1]);
hashMap.put("score", serverData[2]);
hashMap.put("ping", serverData[3]);
hashMap.put("speed", serverData[4]);
hashMap.put("countryLong", serverData[5]);
hashMap.put("countryShort", serverData[6]);
hashMap.put("sessions", serverData[7]);
hashMap.put("uptime", serverData[8]);
hashMap.put("totalUsers", serverData[9]);
hashMap.put("totalTraffic", serverData[10]);
hashMap.put("logType", serverData[11]);
hashMap.put("operator", serverData[12]);
hashMap.put("message", serverData[13]);
hashMap.put("oConfigData", new String(Base64.decode(serverData[14], Base64.DEFAULT)));
String[] lines = hashMap.get("oConfigData").toString().split("[\\r\\n]+");
hashMap.put("port", getPort(lines));
hashMap.put("protocol", getProtocol(lines));
// Veriyi dinleyici aracılığıyla gönderiyoruz
serverLoadListener.onServerLoaded(hashMap);
}
public interface ServerLoadListener {
void onServerLoaded(HashMap serverData);
void onServerLoadFailed(String message);
}
public static String getProtocol(String[] lines){
String protocol = "";
for (String line : lines){
if (!line.startsWith("#")){
if (line.startsWith("proto")){
protocol = line.split(" ")[1];
}
}
}
return protocol;
}
public static int getPort(String[] lines) {
int port =0;
for (String line : lines){
if (!line.startsWith("#")) {
if (line.startsWith("remote")){
port = Integer.parseInt(line.split(" ")[2]);
}
}
}
return port;
}
}
Я перепробовал все, используя gpt и другие источники, но ничего не нашел об этой проблеме.
п>
Подробнее здесь: https://stackoverflow.com/questions/791 ... oy-error-o