2019 May 25.
$ find DIR/ -mmin -N
N: さかのぼる時間(単位:分)
$ find DIR/ -mmin -N
N: さかのぼる時間(単位:分)
package YOUR.PACKAGE; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity { boolean is1stRun = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if ( is1stRun ) { // get text by dialog InputTextDialogFragment cdf = new InputTextDialogFragment(); cdf.show(getSupportFragmentManager(),"dialog"); is1stRun = false; } } public void onReturnValue(String value) { TextView textViewPhrase = (TextView)findViewById(R.id.textViewPhrase); textViewPhrase.setText(value); } }
package YOUR.PACKAGE; import android.app.Dialog; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.EditText; public class InputTextDialogFragment extends DialogFragment { EditText editTextPhrase; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = new Dialog(getActivity()); dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); dialog.setContentView(R.layout.input_text_dialog); editTextPhrase = (dialog.findViewById(R.id.editTextPhrase)); dialog.findViewById(R.id.buttonOK).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String textPhrase = editTextPhrase.getText().toString(); MainActivity callingActivity = (MainActivity) getActivity(); callingActivity.onReturnValue(textPhrase); dismiss(); } }); return dialog; } }
private final Context AppContext; private final String file; // android端末内の外部ストーリッジ確認 ListsdCardFilesDirPaths = SdCardDirPaths.getSdCardFilesDirPathListForLollipop( AppContext ); 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 filePath final String sourcePath = externalPath + "/" + file; Log.d("My", "sourcePath " + sourcePath ); if ( new File(sourcePath).exists()) { Log.d("My", sourcePath + " exists."); } else { Log.d("My", sourcePath + " not exist."); }
import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.os.Environment; import android.util.Log; import java.io.File; import java.util.ArrayList; import java.util.List; public class SdCardDirPaths { /** * SDカードのfilesディレクトリパスのリストを取得する。 * Android5.0以上対応。 * * @param context * @return SDカードのfilesディレクトリパスのリスト */ @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static ListgetSdCardFilesDirPathListForLollipop(Context context) { List sdCardFilesDirPathList = new ArrayList<>(); // getExternalFilesDirsはAndroid4.4から利用できるAPI。 // filesディレクトリのリストを取得できる。 File[] dirArr = context.getExternalFilesDirs(null); for (File dir : dirArr) { if (dir != null) { String path = dir.getAbsolutePath(); Log.d("My", "Externalパスの1つ: " + path); // isExternalStorageRemovableはAndroid5.0から利用できるAPI。 // 取り外し可能かどうか(SDカードかどうか)を判定している。 if (Environment.isExternalStorageRemovable(dir)) { // 取り外し可能であればSDカード。 if (!sdCardFilesDirPathList.contains(path)) { sdCardFilesDirPathList.add(path); } } else { // 取り外し不可能であれば内部ストレージ。 } } } return sdCardFilesDirPathList; } }
import java.util.Comparator; public class CompStringLength implements Comparator{ @Override public int compare(String first, String second){ //null評価 //両方nullなら等価とする if(first == null && second == null){ return 0; } //片方nullなら、nullを小さいとする。 if(first == null){ return -1; }else if(second == null){ return 1; } //idの文字列長でソート。文字列数がが小さい順に並べる。 if(first.length() > second.length()){ return 1; }else if(first.length() < second.length()){ return -1; }else if(first.length() == second.length()){ return 0; } return 0; } }
public class FirstActivity extends AppCompatActivity { Button button1 = (Button) findViewById(R.id.button1); button1.setEnabled(true); TextView textView1 = (TextView) findViewById(R.id.textView1); textView1.setText("start") new SecondTask(this).execute(); }
public class SecondTask extends AsyncTask { private WeakReference weakReference; /** * make WeakReference in constructor * 参照しているActivityを引数にしてWeakReferenceのインスタンスを生成する **/ SecondTask(Context referenceContext) { private WeakReference weakReference; weakReference = new WeakReference<>(referenceContext); } /** * use of WeakReference in onPostExecute * weakReference.get()で参照しているActivityのContextを取得し、それを通じてView を設定したりする **/ @Override protected void onPostExecute(String result) { Activity activity = (Activity) weakReference.get(); if (activity == null || activity.isFinishing()) return; activity.findViewById(R.id.button1).setEnabled(false); TextView tv = activity.findViewById(R.id.textView1); tv.setText("end"); } }
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(); } }); } }
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); } }
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; // 外部ストーリッジ確認 ListsdCardFilesDirPaths = 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; } } }