I am trying to build a ftp app for android using java to upload on a server in our network, but i have some problems with the android integration. I wrote the code in java and it works but when i running it on android i get some errors. If i try running it without the internet or network state permission, it runs but the file won't upload. When i give that permissions and run the application it crashes when trying to connect. This is one of my first time using andorid studio and i didn't find much help online about ftp aplications either.
This is the code i use for connecting to the server.
private void conTest() {
String server = "";
int port = 21;
String user = "";
String pass = "";
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect(server, port);
ftpClient.login(user, pass);
ftpClient.enterLocalPassiveMode();
}catch(IOException ex){
ex.printStackTrace();
}//catchIO exception ex
}
And in log cat it shows the error:
2021-04-02 16:33:19.985 5083-5145/com.example.myapplicationtestmenu D/EGL_emulation: eglMakeCurrent: 0xd0565540: ver 3 0 (tinfo 0xeb2c7d90)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: java.lang.IllegalArgumentException: Unknown URI: content://downloads/public_downloads/6
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.content.ContentProviderProxy.query(ContentProviderNative.java:418)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.content.ContentResolver.query(ContentResolver.java:802)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.content.ContentResolver.query(ContentResolver.java:752)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.content.ContentResolver.query(ContentResolver.java:710)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at com.example.myapplicationtestmenu.RealPathUtil.getDataColumn(RealPathUtil.java:124)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at com.example.myapplicationtestmenu.RealPathUtil.getPath(RealPathUtil.java:59)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at com.example.myapplicationtestmenu.Getfile.onActivityResult(Getfile.java:70)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.app.Activity.dispatchActivityResult(Activity.java:7454)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.app.ActivityThread.deliverResults(ActivityThread.java:4353)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
2021-04-02 16:33:20.606 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.os.Handler.dispatchMessage(Handler.java:106)
2021-04-02 16:33:20.607 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.os.Looper.loop(Looper.java:193)
2021-04-02 16:33:20.607 5083-5083/com.example.myapplicationtestmenu W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6669)
2021-04-02 16:33:20.607 5083-5083/com.example.myapplicationtestmenu W/System.err: at java.lang.reflect.Method.invoke(Native Method)
2021-04-02 16:33:20.607 5083-5083/com.example.myapplicationtestmenu W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
2021-04-02 16:33:20.607 5083-5083/com.example.myapplicationtestmenu W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2021-04-02 16:33:20.648 5083-5083/com.example.myapplicationtestmenu D/AndroidRuntime: Shutting down VM
2021-04-02 16:33:20.651 5083-5083/com.example.myapplicationtestmenu E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplicationtestmenu, PID: 5083
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/document/6 flg=0x1 }} to activity {com.example.myapplicationtestmenu/com.example.myapplicationtestmenu.Getfile}: android.os.NetworkOnMainThreadException
at android.app.ActivityThread.deliverResults(ActivityThread.java:4360)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513)
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:621)
at org.apache.commons.net.SocketClient._connect(SocketClient.java:253)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:212)
at com.example.myapplicationtestmenu.Getfile.conectareee(Getfile.java:87)
at com.example.myapplicationtestmenu.Getfile.onActivityResult(Getfile.java:72)
at android.app.Activity.dispatchActivityResult(Activity.java:7454)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4353)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2021-04-02 16:33:20.659 5083-5083/com.example.myapplicationtestmenu I/Process: Sending signal. PID: 5083 SIG: 9
This is the java class:
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
public class Getfile extends AppCompatActivity {
Button pick;
TextView viewPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_getfile);
Log.v("TAG1","Start");
pick=findViewById(R.id.pick);
viewPath=findViewById(R.id.path);
if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(Getfile.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
pick.setOnClickListener(v -> {
Intent intent =new Intent();
intent.setType("*/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent,1);
//ftpUpload.Test();
Log.v("TAG2","Note");
});
}
@Override
public void onActivityResult(int requestCode, int resultCode , Intent data){
super.onActivityResult(requestCode,resultCode,data);
if(requestCode==1 && resultCode==Activity.RESULT_OK) {
Uri uri = data.getData();
Context context = getApplicationContext();
String path = RealPathUtil.getPath(context, uri);
viewPath.setText("Uri= " + uri.toString() + "\n\nPath= " + path);
conectareee();
Log.v("we are here","-----------------------------------------------------");
}
}
private void conectareee() {
String server = "";
int port = 21;
String user = "";
String pass = "";
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect(server, port);
ftpClient.login(user, pass);
ftpClient.enterLocalPassiveMode();
Log.v("connected","Connected");
}catch(IOException ex){
ex.printStackTrace();
Log.v("Not connected","Not");
}//catchIO exception ex
}
And the manifest file contains:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />