I'm still new to Android development, and for one of my projects I decided to make a simple FTP client using Apache Commons.
Whenever I try to connect to the FTP server I get this error
FATAL EXCEPTION: main
Process: com.example.ftpbuddy, PID: 6287
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1667)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:389)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
at java.net.Socket.connect(Socket.java:646)
at org.apache.commons.net.SocketClient._connect(SocketClient.java:132)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:268)
at com.example.ftpbuddy.FTPServices.loginFtp(FTPServices.java:15)
at com.example.ftpbuddy.MainActivity$ConnectButtonHandler.onClick(MainActivity.java:38)
at android.view.View.performClick(View.java:7506)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
at android.view.View.performClickInternal(View.java:7483)
at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
at android.view.View$PerformClick.run(View.java:29334)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7872)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
I'm not sure why this is giving me an issue. The connection details are correct, and I've set the permissions. Here's my code
MainActivity.java
package com.example.ftpbuddy;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import org.apache.commons.net.ftp.FTPClient;
public class MainActivity extends AppCompatActivity {
EditText etHost;
EditText etPort;
EditText etUsername;
EditText etPassword;
Button btnConnect;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etHost = findViewById(R.id.etHost);
etPort = findViewById(R.id.etPort);
etUsername = findViewById(R.id.etUsername);
etPassword = findViewById(R.id.etPassword);
btnConnect = findViewById(R.id.btnConnect);
btnConnect.setOnClickListener(new ConnectButtonHandler());
}
public class ConnectButtonHandler implements View.OnClickListener {
@Override
public void onClick(View v) {
FTPServices services = new FTPServices();
FTPClient current = services.loginFtp(
etHost.getText().toString(),
Integer.parseInt(etPort.getText().toString()),
etUsername.getText().toString(),
etPassword.getText().toString()
);
services.printDirectory("/home/gabriel", current);
}
}
}
FTPService.java
package com.example.ftpbuddy;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import java.io.IOException;
public class FTPServices {
public FTPClient loginFtp(String host, int port, String username, String password) {
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect(host, port);
ftpClient.login(username, password);
} catch (IOException e) {
System.out.println(e.getMessage());
System.out.println(e.getCause());
}
return ftpClient;
}
public void printDirectory(String directory, FTPClient ftpClient) {
try {
for(FTPFile ftpFile : ftpClient.listFiles(directory)) {
System.out.println(ftpFile.getName());
System.out.println();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
These are the permissions:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Once again, I'm not too sure why this is happening, all the connection details are correct. If somebody could help guide me to the right direction then that would be great, thanks.