0

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.

Olaf Kock
  • 46,930
  • 8
  • 59
  • 90
  • 3
    Your problem is that you're trying to access the network on the main thread, just like [the exception's documentation](https://developer.android.com/reference/android/os/NetworkOnMainThreadException) says you can't do. – ianhanniballake Jun 04 '23 at 03:56

0 Answers0