Anonymous
У меня есть ошибка «java.lang.NullPointerException void java.lang.Process.destroy()» в моем приложении VPN для Android,
Сообщение
Anonymous » 18 ноя 2024, 13:43
Я пытаюсь научиться разрабатывать приложения для Android с помощью Java. У меня есть некоторая проблема. когда я нажал кнопку подключения, у меня возникла эта ошибка:
Код: Выделить всё
OpenVPNThread Got java.lang.NullPointerException: Attempt to invoke virtual method 'void java.lang.Process.destroy()' on a null object reference.
Вот мои коды HomeActivity
Код: Выделить всё
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);
}
}
А вот мои коды Servers.java:
Код: Выделить всё
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
1731926626
Anonymous
Я пытаюсь научиться разрабатывать приложения для Android с помощью Java. У меня есть некоторая проблема. когда я нажал кнопку подключения, у меня возникла эта ошибка: [code] OpenVPNThread Got java.lang.NullPointerException: Attempt to invoke virtual method 'void java.lang.Process.destroy()' on a null object reference. [/code] Вот мои коды HomeActivity [code] 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); } } [/code] А вот мои коды Servers.java: [code] 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; } } [/code] Можете ли вы помочь мне решить эту проблему? Я перепробовал все, используя gpt и другие источники, но ничего не нашел об этой проблеме. п> Подробнее здесь: [url]https://stackoverflow.com/questions/79199610/i-have-java-lang-nullpointerexception-void-java-lang-process-destroy-error-o[/url]