如何使用 sftp 输入流在 android 应用程序中设置图像?
How to set an image in android app with sftp input stream?
我正在使用 Android Studio 构建应用程序。在此应用程序中,我想使用 Jsch sftp
从 linux 主机获取特定文件夹中的图像,并将此新图片设置为已存在的图像视图。
可惜图片没有显示出来
目前的代码如下:
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.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 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);
new AsyncTask<Integer, Void, Void>(){
@Override
protected Void doInBackground(Integer... params) {
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(10000);
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("AAP.jpg"));
Drawable ddd = Drawable.createFromStream(bis,"ddd");
bis.close();
// bos.close();
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
}.execute(1);
iv1.setImageDrawable(ddd);
//iv1.setScaleX(1);
//iv1.setScaleY(1);
Toast.makeText(getApplicationContext(), "Successful Download", Toast.LENGTH_LONG).show();
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_height="match_parent">
<Button
android:text="Show Picture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="31dp"
android:onClick="show_picture_func"
android:id="@+id/button_show" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="?android:attr/alertDialogIcon"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:id="@+id/imageView1"
android:scaleX="5"
android:scaleY="5" />
</RelativeLayout>
当我按下show picture
按钮时,imageview的默认图片消失了,什么也没有显示。另外,这涉及到 logcat
:
E/HW-JPEG-DEC: [HME_JPEG_DEC_Delete](3321): HME_JPEG_DEC_Delete: decoder_ctx=null
注意 这个错误几乎每次出现在我写的所有应用程序上,但它对它们没有任何影响。我不确定这个。
那么,问题是什么?我该如何解决?
使用以下方法将imageView drawable转换为输入流
void getInputStreamFromImageView(ImageView imageView) {
Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
byte[] bitmapdata = bos.toByteArray();
ByteArrayInputStream bs = new ByteArrayInputStream(bitmapdata);
}
先声明ddd
紧接着:
new AsyncTask<Integer, Void, Void>(){
所以:
new AsyncTask<Integer, Void, Void>(){
Drawable ddd = null;
@Override
protected Void doInBackground(Integer... params) {
然后在doInBackround
中更改行:
Drawable ddd = Drawable.createFromStream(bis,"ddd");
至:
ddd = Drawable.createFromStream(bis,"ddd");
最后将 iv1.setImageDrawable(ddd);
移动到 AsyncTask
的 onPostExecute
内(您必须像对 doInBackground
所做的那样覆盖它):
@Override
protected void onPostExecute(Void unused) {
iv1.setImageDrawable(ddd);
}
我正在使用 Android Studio 构建应用程序。在此应用程序中,我想使用 Jsch sftp
从 linux 主机获取特定文件夹中的图像,并将此新图片设置为已存在的图像视图。
可惜图片没有显示出来
目前的代码如下:
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.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 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);
new AsyncTask<Integer, Void, Void>(){
@Override
protected Void doInBackground(Integer... params) {
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(10000);
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("AAP.jpg"));
Drawable ddd = Drawable.createFromStream(bis,"ddd");
bis.close();
// bos.close();
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
}.execute(1);
iv1.setImageDrawable(ddd);
//iv1.setScaleX(1);
//iv1.setScaleY(1);
Toast.makeText(getApplicationContext(), "Successful Download", Toast.LENGTH_LONG).show();
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_height="match_parent">
<Button
android:text="Show Picture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="31dp"
android:onClick="show_picture_func"
android:id="@+id/button_show" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="?android:attr/alertDialogIcon"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:id="@+id/imageView1"
android:scaleX="5"
android:scaleY="5" />
</RelativeLayout>
当我按下show picture
按钮时,imageview的默认图片消失了,什么也没有显示。另外,这涉及到 logcat
:
E/HW-JPEG-DEC: [HME_JPEG_DEC_Delete](3321): HME_JPEG_DEC_Delete: decoder_ctx=null
注意 这个错误几乎每次出现在我写的所有应用程序上,但它对它们没有任何影响。我不确定这个。
那么,问题是什么?我该如何解决?
使用以下方法将imageView drawable转换为输入流
void getInputStreamFromImageView(ImageView imageView) {
Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
byte[] bitmapdata = bos.toByteArray();
ByteArrayInputStream bs = new ByteArrayInputStream(bitmapdata);
}
先声明ddd
紧接着:
new AsyncTask<Integer, Void, Void>(){
所以:
new AsyncTask<Integer, Void, Void>(){
Drawable ddd = null;
@Override
protected Void doInBackground(Integer... params) {
然后在doInBackround
中更改行:
Drawable ddd = Drawable.createFromStream(bis,"ddd");
至:
ddd = Drawable.createFromStream(bis,"ddd");
最后将 iv1.setImageDrawable(ddd);
移动到 AsyncTask
的 onPostExecute
内(您必须像对 doInBackground
所做的那样覆盖它):
@Override
protected void onPostExecute(Void unused) {
iv1.setImageDrawable(ddd);
}