2019 May. 03.
2019 May. 02.
https://qiita.com/nenokido2000/items/a00348c9f6a0f942773b より
MainActivity.java
MyTask.java
MyJsch.java
2019 May. 02.
https://qiita.com/nenokido2000/items/a00348c9f6a0f942773b より
MainActivity.java
package YOUR.PACKAGE.NAME;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
/** Channel接続タイプ */
private static final String CHANNEL_TYPE = "sftp";
private MyTask task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
final String ServerIP = "ServerIP";
final int Port = PortNum;
final String UserId = "USER";
final String PassPhrase = "YOURPASSPHRASE";
final String IdentityKeyPath = "YOUR/SECRET/FILE/PATH"; // Do not attach '/' at head of path
final String SourcePath = "PATH/TO/SOURCE/FILE"; // Do not attach '/' at head of path
final String DestPath = "PATH/TO/DEST/FILE";
*/
final String ServerIP="";
final int Port = ;
final String UserId = "";
final String PassPhrase = "";
final String IdentityKeyPath = "";
final String SourcePath = "";
final String DestPath = "";
Button button1= (Button) findViewById(R.id.button1);
TextView textView1 = (TextView) findViewById(R.id.textView1);
// タスクの生成
task = new MyTask(ServerIP, Port, UserId, PassPhrase, IdentityKeyPath, SourcePath, DestPath,this);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setEnabled(false);
// 非同期処理を開始する
task.execute();
}
});
}
}
MyTask.java
package YOUR.PACKAGE.NAME; import android.app.Activity; import android.content.Context; import android.os.AsyncTask; import android.widget.TextView; import com.jcraft.jsch.JSchException; import java.lang.ref.WeakReference; public class MyTask extends AsyncTask{ private final String ServerIp; private final int Port; private final String User; private final String IdentityKeyPath; private final String PassPhrase; private final String SrcPath; private final String DestPath; private WeakReference weakReference; // constructor MyTask(final String ServerIp, final int Port, final String User, final String PassPhrase, final String IdentityKeyPath, final String SrcPath, final String DestPath, Context referenceContext) { super(); // 呼び出し元へのweakReference weakReference = new WeakReference<>(referenceContext); this.ServerIp = ServerIp; this.Port = Port; this.User = User; this.PassPhrase = PassPhrase; this.IdentityKeyPath = IdentityKeyPath; this.SrcPath = SrcPath; this.DestPath = DestPath; } /** * バックグランドで行う処理 */ @Override protected String doInBackground(Void... value) { // startJsch MyJsch mJsch = new MyJsch( ServerIp, Port, User, PassPhrase, IdentityKeyPath, SrcPath, DestPath, weakReference.get()); try { mJsch.putFile(); } catch (JSchException e) { e.printStackTrace(); return e.toString(); } return "Success"; } /** * バックグランド処理が完了し、UIスレッドに反映する */ @Override protected void onPostExecute(String result) { // get a reference to the activity if it is still there Activity activity = (Activity) weakReference.get(); if (activity == null || activity.isFinishing()) return; activity.findViewById(R.id.button1).setEnabled(true); TextView tv = activity.findViewById(R.id.textView1); tv.setText(result); } }
MyJsch.java
package YOUR.PACKAGE.NAME;
import android.content.Context;
import android.util.Log;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
import com.jcraft.jsch.UserInfo;
import java.io.File;
import java.util.Collections;
import java.util.List;
public class MyJsch {
private final String ServerIp;
private final int Port;
private final String User;
private final String PassPhrase;
private final String IdentityKeyPath;
private final String SrcPath;
private final String DestPath;
private Context activityContext;
private String externalPath;
/** Channel接続タイプ */
private static final String CHANNEL_TYPE = "sftp";
/**
* コンストラクタ
*/
MyJsch(final String ServerIp, final int Port, final String User, final String PassPhrase,
final String IdentityKeyPath, final String SrcPath, final String DestPath,
Context activityContext) {
this.ServerIp = ServerIp;
this.Port = Port;
this.User = User;
this.IdentityKeyPath = IdentityKeyPath;
this.PassPhrase = PassPhrase;
this.SrcPath = SrcPath;
this.DestPath = DestPath;
this.activityContext = activityContext;
}
/**
* ファイルアップロード
*
* @throws JSchException
* Session・Channelの設定/接続エラー時に発生
*/
public void putFile()
throws JSchException {
Session session = null;
ChannelSftp channel = null;
// 外部ストーリッジ確認
List sdCardFilesDirPaths =
SdCardDirPaths.getSdCardFilesDirPathListForLollipop( activityContext );
Collections.sort(sdCardFilesDirPaths, new CompStringLength());
for (String p : sdCardFilesDirPaths) {
Log.d("My", "SDパスの1つ: " + p);
}
externalPath = sdCardFilesDirPaths.get(0);
externalPath = externalPath.replaceAll("/Android.*$", "");
Log.d("My", "SDパス: " + externalPath);
// get sourcePath
final String sourcePath = externalPath + "/" + SrcPath;
Log.d("My", "sourcePath " + sourcePath );
if ( new File(sourcePath).exists()) {
Log.d("My", sourcePath + " exists.");
} else {
Log.d("My", sourcePath + " not exist.");
}
/*
* sftp通信を実行
*/
try {
session = connectSession();
channel = connectChannelSftp(session);
String absoluteDestPath = channel.getHome() + "/" + DestPath;
String destFile = new File(absoluteDestPath).getName();
int numDestPath = absoluteDestPath.length();
int numDestFile = destFile.length();
String destParentPath = absoluteDestPath.substring( 0, numDestPath - numDestFile );
Log.d("My", "absoluteDestPath is " + absoluteDestPath);
Log.d("My", "destFile is " + destFile);
Log.d("My", "destParentPath is " + destParentPath);
Log.d("My", "current local directory is " + channel.lpwd());
Log.d("My", "remote home directory is " + channel.getHome());
channel.cd(destParentPath);
channel.put(sourcePath, destFile);
try {
channel.lstat(destFile);
} catch (SftpException e) {
Log.d("My", DestPath + " does not exist.");
Log.d("My", e.toString());
}
} catch (SftpException e) {
Log.d("My",e.toString());
} finally {
disconnect(session, channel);
}
}
/**
* Sessionを開始
*/
private Session connectSession()
throws JSchException {
final JSch jsch = new JSch();
// 鍵追加
String keyFilePath = externalPath + "/" + IdentityKeyPath;
if ( new File(keyFilePath).exists()) {
Log.d("My", keyFilePath + " exists.");
} else {
Log.d("My", keyFilePath + " not exist.");
}
jsch.addIdentity(keyFilePath, PassPhrase);
// Session設定
final Session session = jsch.getSession(User, ServerIp, Port);
final UserInfo userInfo = new SftpUserInfo();
// TODO 今回は使用しないがパスフレーズ等が必要な場合はUserInfoインスタンス経由で設定する
session.setUserInfo(userInfo);
session.connect();
return session;
}
/**
* SFTPのChannelを開始
*
* @param session
* 開始されたSession情報
*/
private ChannelSftp connectChannelSftp(final Session session)
throws JSchException {
final ChannelSftp channel = (ChannelSftp) session.openChannel(CHANNEL_TYPE);
try {
channel.connect();
} catch (JSchException e) {
Log.d("My", e.toString());
}
return channel;
}
/**
* Session・Channelの終了
*
* @param session
* 開始されたSession情報
* @param channels
* 開始されたChannel情報.複数指定可能
*/
private void disconnect(final Session session, final Channel... channels) {
if (channels != null) {
for (Channel c: channels ) {
if (c != null) {
c.disconnect();
}
}
}
if (session != null) {
session.disconnect();
}
}
/**
* SFTPに接続するユーザ情報を保持するクラス
*/
private static class SftpUserInfo implements UserInfo {
@Override
public String getPassword() {
return null;
}
@Override
public boolean promptPassword(String arg0) {
return true;
}
@Override
public boolean promptPassphrase(String arg0) {
return true;
}
@Override
public boolean promptYesNo(String arg0) {
return true;
}
@Override
public void showMessage(String arg0) {
}
@Override
public String getPassphrase() {
return null;
}
}
}
0 件のコメント:
コメントを投稿