我的应用无法下载带有sftp的文件

时间:2017-11-09 14:37:10

标签: android sftp networkonmainthread

我正在构建一个Android应用程序,用sftp从linux主机(Raspberry Pi)获取.jpg文件。以下是我的代码。但是当我按下按钮时,它会保持Connection Error

MainActivity.java

package com.example.picture_controller_2;

import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.app.Activity;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.SftpException;
import android.view.View;
import android.os.AsyncTask;
import android.widget.ImageView;
import android.widget.Toast;

public class Button2Activity extends AppCompatActivity {

    private ImageView iv1;
    private Drawable ddd;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_button2);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    public void show_picture_func (View v) {

        iv1 = (ImageView) findViewById(R.id.imageView1);    

                String SFTPHOST = "192.168.0.1";
                int SFTPPORT =22;
                String SFTPUSER = "pi";
                String SFTPPASS = "raspberry";
                String SFTPWORKINGDIR = "/home/pi/imgs/";

                Session session = null;
                Channel channel = null;
                ChannelSftp channelSftp = null;

                try {
                    JSch jsch = new JSch();
                    session = jsch.getSession(SFTPUSER, SFTPHOST, SFTPPORT);
                    session.setPassword(SFTPPASS);
                    session.setConfig("StrictHostKeyChecking", "no");
                    session.setTimeout(1000);
                    session.connect();
                    channel = session.openChannel("sftp");
                    channel.connect();
                    channelSftp = (ChannelSftp) channel;
                    channelSftp.cd(SFTPWORKINGDIR);
                    byte[] buffer = new byte[1024];
                    BufferedInputStream bis = new BufferedInputStream(channelSftp.get("/home/pi/imgs/AAP.jpg"));


                    Drawable ddd = Drawable.createFromStream(bis,"ddd");

                    Toast.makeText(getApplicationContext(), "Connection OK", Toast.LENGTH_LONG).show();
                } catch (Exception ex) {
                    Toast.makeText(getApplicationContext(), "Connection Error", Toast.LENGTH_LONG).show();
                    ex.printStackTrace();
                }

        iv1.setImageDrawable(ddd);
        Toast.makeText(getApplicationContext(), "Picture Success", Toast.LENGTH_LONG).show();
    }

}

那么,我错过了什么?

UPDATE1

按下按钮时,以下是logcat消息:

11-09 18:26:59.008 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err: android.os.NetworkOnMainThreadException
11-09 18:26:59.008 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1315)
11-09 18:26:59.008 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
11-09 18:26:59.008 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at java.net.SocketOutputStream.write(SocketOutputStream.java:157)
11-09 18:26:59.008 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at com.jcraft.jsch.IO.put(IO.java:64)
11-09 18:26:59.008 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at com.jcraft.jsch.Session.connect(Session.java:256)
11-09 18:26:59.008 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at com.jcraft.jsch.Session.connect(Session.java:183)
11-09 18:26:59.008 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at ir.sapna_co.adalux_controller_2.Button2Activity.show_picture_func(Button2Activity.java:65)
11-09 18:26:59.008 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
11-09 18:26:59.008 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
11-09 18:26:59.008 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at android.view.View.performClick(View.java:5646)
11-09 18:26:59.009 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at android.view.View$PerformClick.run(View.java:22459)
11-09 18:26:59.009 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at android.os.Handler.handleCallback(Handler.java:761)
11-09 18:26:59.009 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:98)
11-09 18:26:59.009 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at android.os.Looper.loop(Looper.java:156)
11-09 18:26:59.009 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6531)
11-09 18:26:59.009 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
11-09 18:26:59.009 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941)
11-09 18:26:59.009 16361-16361/ir.sapna_co.adalux_controller_2 W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:831)
11-09 18:26:59.012 16361-16361/ir.sapna_co.adalux_controller_2 I/HwPointEventFilter: do not support AFT because of no config
11-09 18:26:59.058 16361-16361/ir.sapna_co.adalux_controller_2 I/HwPointEventFilter: do not support AFT because of no config

1 个答案:

答案 0 :(得分:1)

show_picture_func的网络代码包含在AsyncTask内,并在onPostExecute方法中执行您的UI内容:

public void show_picture_func (View v) {
    new AsyncTask<Void, Void, Void>() {

            Drawable ddd = null;

            protected Void doInBackground(Void... unused) {
                    // Background Code
                    String SFTPHOST = "192.168.0.1";
                    int SFTPPORT =22;
                    String SFTPUSER = "pi";
                    String SFTPPASS = "raspberry";
                    String SFTPWORKINGDIR = "/home/pi/imgs/";

                    Session session = null;
                    Channel channel = null;
                    ChannelSftp channelSftp = null;

                    try {
                        JSch jsch = new JSch();
                        session = jsch.getSession(SFTPUSER, SFTPHOST, SFTPPORT);
                        session.setPassword(SFTPPASS);
                        session.setConfig("StrictHostKeyChecking", "no");
                        session.setTimeout(1000);
                        session.connect();
                        channel = session.openChannel("sftp");
                        channel.connect();
                        channelSftp = (ChannelSftp) channel;
                        channelSftp.cd(SFTPWORKINGDIR);
                        byte[] buffer = new byte[1024];
                        BufferedInputStream bis = new BufferedInputStream(channelSftp.get("/home/pi/imgs/AAP.jpg"));

                        ddd = Drawable.createFromStream(bis,"ddd");
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }


                    return null;
            }
            protected void onPostExecute(Void unused) {
                    // Post Code
                    iv1.setImageDrawable(ddd);
                    Toast.makeText(getApplicationContext(), "Picture Success", Toast.LENGTH_LONG).show();
            }
    }.execute();
}