文件管理添加选项FTP
来源:互联网 发布:咪咕善跑是什么软件 编辑:程序博客网 时间:2024/06/11 20:51
在文件管理器里面添加FTP功能,功能的主要实现是在jar包里面,文件管理只是做了引用而已.
filemanageroperateactivity.java:
import android.support.v4.view.ViewPager;import android.net.wifi.WifiInfo;import android.net.wifi.WifiManager;import android.os.AsyncTask;import android.os.storage.StorageManager;import java.io.InputStream;import java.io.OutputStream;import java.io.FileOutputStream;import java.net.InetAddress;import org.apache.ftpserver.FtpServer;import org.apache.ftpserver.FtpServerFactory;import org.apache.ftpserver.ftplet.FtpException;import org.apache.ftpserver.listener.ListenerFactory;import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory;public class FileManagerOperationActivity extends AbsBaseActivity implements AdapterView.OnItemLongClickListener, NfcAdapter.CreateBeamUrisCallback { static { System.setProperty("java.net.preferIPv6Addresses", "false"); }private View mViewIpAdress;private View mViewIpAdress;private ImageView mImgWifi;private Button mBtnStartServer;private TextView mTxtWifiName;private TextView mTxtIpAdress;private TextView mTxtFtpMsg;private StorageManager mStorageManager = null;private FtpServer mFtpServer;private String mStrIpAdress;private boolean mIsMounted = true;private boolean mIsStartServer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!PermissionUtils.hasStorageReadPermission(getApplicationContext())) { PermissionUtils.requestPermission(FileManagerOperationActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE_ON_CREATE); } // get sort by mSortType = getPrefsSortBy(); mOrientationConfig = this.getResources().getConfiguration().orientation; mNfcAdapter = NfcAdapter.getDefaultAdapter(this); if (mNfcAdapter == null) { LogUtils.w(TAG, "mNfcAdapter == null"); } else if (OptionsUtils.isMtkBeamSurpported()) { //mNfcAdapter.setMtkBeamPushUrisCallback(this, this); } IntentFilter localeFilter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED); registerReceiver(mLocaleChangedReceiver, localeFilter); PDebug.End("FileManagerOperationActivity -- onCreate"); if (mStorageManager == null) { mStorageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE); registerWifiChangeReceiver(); } } @Override protected void onDestroy() { unregisterReceiver(mLocaleChangedReceiver); stopServerSettings(); stopServer(); ((FileManagerApplication)FileManagerApplication.getInstance()).clearNotification(this); unregisterWifiChangeReceiver(); super.onDestroy(); }@Override public void onEjected(String unMountPoint) { super.onEjected(unMountPoint); mIsMounted = false; stopServer(); updateUI(); } @Override protected void serviceConnected() { LogUtils.d(TAG, "serviceConnected..."); super.serviceConnected(); if (mSavedInstanceState != null) { int mode = mSavedInstanceState.getInt(CURRENT_VIEW_MODE_KEY, FileInfoAdapter.MODE_NORMAL); int position = mSavedInstanceState.getInt(CURRENT_POSTION_KEY, 0); int top = mSavedInstanceState.getInt(CURRENT_TOP_KEY, -1); LogUtils.d(TAG, "serviceConnected mode=" + mode); restoreViewMode(mode, position, top); } mListView.setOnItemLongClickListener(this); showOverflewButton(); loadColors(); loadBrowseData(); bindWidgets(); mMap = new HashMap<Integer,ArrayList<BrowseInfo>>(); mBrowseList = new ArrayList<BrowseInfo>(); mTabBrowse.setOnClickListener(this); mTabFile.setOnClickListener(this); mTabFtp.setOnClickListener(this); mViewPagerAdapter = new FileManagerPagerAdapter(mViews); mPagerAdapter = new ViewPagerOnChangeListener(); mViewPager.setAdapter(mViewPagerAdapter); mViewPager.setOnPageChangeListener(mPagerAdapter); if(ifActionFromDialer){ mViewPager.setCurrentItem(FileUtils.TAB_ON_FILE); } } @Override public void onClick(View view) { if (mService.isBusy(this.getClass().getName())) { LogUtils.d(TAG, "onClick, service is busy,return."); return; } int id = view.getId(); LogUtils.d(TAG, "onClick,id: " + id); boolean isMounted = mMountPointManager.isRootPathMount(mCurrentPath); if (mAdapter.isMode(FileInfoAdapter.MODE_EDIT) && isMounted) { mActionModeCallBack.updateActionMode(); LogUtils.d(TAG, "onClick,retuen."); return; } switch (view.getId()) { case R.id.browse: mViewPager.setCurrentItem(FileUtils.TAB_ON_BROWSE); break; case R.id.file: mViewPager.setCurrentItem(FileUtils.TAB_ON_FILE); break; case R.id.ftp: mViewPager.setCurrentItem(FileUtils.TAB_ON_FTP); break; case R.id.rgk_file_ftp_btn_start_server: mIsStartServer = !mIsStartServer; updateUI(); break; case R.id.rgk_file_ftp_img_wifi: jumpToWifiSettings(); break; } super.onClick(view); } @Override public boolean onPrepareOptionsMenu(Menu menu) { LogUtils.d(TAG, "onPrepareOptionsMenu..."); super.onPrepareOptionsMenu(menu); //here must return, otherwise menu item will null(because of no inflate menu //onCreateOptionsMenu() and this leads null pointer exception if (null == mService) { LogUtils.i(TAG, "onPrepareOptionsMenu, invalid service,return true."); return true; } if (FileUtils.mCurMode == FileUtils.SELECT_FILE_MODE || mViewPager.getCurrentItem() == FileUtils.TAB_ON_FTP) { menu.findItem(R.id.create_folder).setVisible(false); menu.findItem(R.id.change_mode).setVisible(false); menu.findItem(R.id.hide).setVisible(false); menu.findItem(R.id.sort).setVisible(false); menu.findItem(R.id.paste).setVisible(false); menu.findItem(R.id.search).setVisible(false); return true; } protected void onNewIntent(Intent intent) { String action = intent.getAction(); String hotknotPath = null; LogUtils.d(TAG, "onNewIntent action: " + action); if (action != null && action.equals(FileUtils.FTP_NOTIFICATION_ACTION)) { if (mViewPager != null) { mViewPager.setCurrentItem(FileUtils.TAB_ON_FTP); } } private void bindWidgets() { mGridView = (WtkBrowseGridView) mBrowseView.findViewById(R.id.gridview); mGridViewAdapter = new GridViewAdapter(); mGridView.setAdapter(mGridViewAdapter); mGridView.setOnItemClickListener(new BrowseItemClickListener()); mWtkListView = (WtkListView) mBrowseView.findViewById(R.id.browse_progressbar_listview); mProgressBarAdapter = new ProgressBarAdapter(); mWtkListView.setAdapter(mProgressBarAdapter); mViewIpAdress = (View) mFtpView.findViewById(R.id.rgk_file_ftp_ip_adress_view); mImgWifi = (ImageView) mFtpView.findViewById(R.id.rgk_file_ftp_img_wifi); mBtnStartServer = (Button) mFtpView.findViewById(R.id.rgk_file_ftp_btn_start_server); mTxtWifiName = (TextView) mFtpView.findViewById(R.id.rgk_file_ftp_wifi_name); mTxtIpAdress = (TextView) mFtpView.findViewById(R.id.rgk_file_ftp_ip_adress); mTxtFtpMsg = (TextView) mFtpView.findViewById(R.id.rgk_file_ftp_msg); mImgWifi.setOnClickListener(this); mBtnStartServer.setOnClickListener(this); @Override public void onPageSelected(final int arg0) { if (mViewPager.getCurrentItem() == FileUtils.TAB_ON_FTP) { updateUI(); resetTabTxtColor(); mTabFtp.setTextColor(mTabTxtColorFocus); } private void registerWifiChangeReceiver() { IntentFilter filter = new IntentFilter(); filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); filter.addAction("android.net.wifi.STATE_CHANGE"); registerReceiver(mWifiChangeReceiver, filter); } private void unregisterWifiChangeReceiver() { if (mWifiChangeReceiver != null) { unregisterReceiver(mWifiChangeReceiver); } } private void jumpToWifiSettings() { Intent intent = new Intent(); intent.setAction(WIFI_SETTINGS_ACTION); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); } private void updateUI() { if (mTxtWifiName == null || mImgWifi == null || mBtnStartServer== null) { return; } WifiManager wifiMgr = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifiMgr.getConnectionInfo(); String wifiId = info != null ? info.getSSID() : null; Log.d(TAG,"wifiId: "+wifiId); boolean isWifiReady = FileUtils.isConnectedUsingWifi(); Log.d(TAG,"isWifiReady: "+isWifiReady); if (!TextUtils.isEmpty(wifiId)) { mTxtWifiName.setText(wifiId); } if (!isWifiReady) { mIsStartServer = false; } if (mIsStartServer) { if (mFtpServer == null || mFtpServer.isStopped()) { initFtpServer(); InetAddress address = FileUtils.getLocalInetAddress(); if (address != null) { mStrIpAdress = FileUtils.FTP + address.getHostAddress() + FileUtils.FTP_COLON + FileUtils.PORT; startFtpServer(); startServerSettings(); } else { stopServer(); mStrIpAdress = ""; stopServerSettings(); } } } else { if (mFtpServer != null && !mFtpServer.isStopped()) { stopServer(); stopServerSettings(); } } mBtnStartServer.setEnabled(isWifiReady); if (isWifiReady) { mImgWifi.setImageResource(R.drawable.wifi_state4_light); mBtnStartServer.setText((mFtpServer != null && !mFtpServer.isStopped()) ? R.string.rgk_file_ftp_stop_server : R.string.rgk_file_ftp_start_server); } else { mImgWifi.setImageResource(R.drawable.wifi_state0_light); mTxtWifiName.setText(R.string.rgk_file_no_wlan); stopServer(); stopServerSettings(); } boolean isUsbMassStorage = mStorageManager.isUsbMassStorageEnabled(); Log.d(TAG,"isUsbMassStorage: "+isUsbMassStorage); Log.d(TAG,"mIsMounted: "+mIsMounted); if (!mIsMounted) { mBtnStartServer.setEnabled(false); } else if (mIsMounted && isWifiReady){ mBtnStartServer.setEnabled(!isUsbMassStorage); } if (isUsbMassStorage) { stopServer(); mStrIpAdress = ""; stopServerSettings(); } } private void startServerSettings() { mBtnStartServer.setText(R.string.rgk_file_ftp_stop_server); mTxtFtpMsg.setVisibility(View.GONE); mViewIpAdress.setVisibility(View.VISIBLE); mTxtIpAdress.setText(mStrIpAdress); } private void stopServerSettings() { mBtnStartServer.setText(R.string.rgk_file_ftp_start_server); mViewIpAdress.setVisibility(View.GONE); mTxtFtpMsg.setVisibility(View.VISIBLE); } private void startFtpServer() { try { if (mFtpServer != null && mFtpServer.isStopped()) { ((FileManagerApplication)FileManagerApplication.getInstance()).setupNotification(this); mFtpServer.start(); } } catch (FtpException e) { e.printStackTrace(); } } private void stopServer() { mIsStartServer = false; if (mFtpServer != null && !mFtpServer.isStopped()) { ((FileManagerApplication)FileManagerApplication.getInstance()).clearNotification(this); mFtpServer.stop(); } } private BroadcastReceiver mWifiChangeReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); updateUI(); } }; private void initFtpServer() { Log.d(TAG,"initFtpServer."); FtpServerFactory serverFactory = new FtpServerFactory(); ListenerFactory factory = new ListenerFactory(); PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory(); File file = writeToFile(); if (file == null) { return; } userManagerFactory.setFile(file); serverFactory.setUserManager(userManagerFactory.createUserManager()); factory.setPort(FileUtils.PORT); serverFactory.addListener("default", factory.createListener()); FtpServer server = serverFactory.createServer(); Log.d(TAG,"Ftp createServer."); this.mFtpServer = server; } private File writeToFile() { File file = null; InputStream in = null; OutputStream out = null; try { in = this.getResources().openRawResource(R.raw.users); file = new File(FileUtils.FTP_USER_PROPERTIES_PATH); if (file.exists()) { return file; } file.createNewFile(); out = new FileOutputStream(file); byte[] buffer = new byte[1024]; int length = 0; while ((length = in.read(buffer)) > 0) { out.write(buffer,0, length); } out.flush(); if (in != null) { in.close(); } if (out != null) { out.close(); } } catch (Exception e) { e.printStackTrace(); } Log.d("psm","file : "+file); return file; } FileUtil.java里面的: import com.mediatek.filemanager.FileManagerApplication; import java.net.InetAddress;import java.net.NetworkInterface;import java.net.UnknownHostException;import java.util.Enumeration;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.net.wifi.WifiManager; public static final int TAB_ON_FTP = 2; public static String FTP = "ftp://"; public static String FTP_COLON = ":"; public static final String FTP_NOTIFICATION_ACTION = "com.android.FTP_ACTION"; public static final String FTP_USER_PROPERTIES_PATH = "/storage/sdcard0/.users.properties"; public static int PORT = 2121; public static InetAddress getLocalInetAddress() { if (!isConnectedToLocalNetwork()) { Log.e(TAG, "getLocalInetAddress called and no connection"); return null; } // @TODO: next if block could probably be removed if (isConnectedUsingWifi()) { Context context = FileManagerApplication.getInstance(); WifiManager wm = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); int ipAddress = wm.getConnectionInfo().getIpAddress(); if (ipAddress == 0) return null; return intToInet(ipAddress); } // This next part should be able to get the local ip address, but in // some case // I'm receiving the routable address try { Enumeration<NetworkInterface> netinterfaces = NetworkInterface .getNetworkInterfaces(); while (netinterfaces.hasMoreElements()) { NetworkInterface netinterface = netinterfaces.nextElement(); Enumeration<InetAddress> adresses = netinterface .getInetAddresses(); while (adresses.hasMoreElements()) { InetAddress address = adresses.nextElement(); // this is the condition that sometimes gives problems if (!address.isLoopbackAddress() && !address.isLinkLocalAddress()) return address; } } } catch (Exception e) { e.printStackTrace(); } return null; } public static boolean isConnectedToLocalNetwork() { Context context = FileManagerApplication.getInstance(); ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = cm.getActiveNetworkInfo(); // @TODO: this is only defined starting in api level 13 final int TYPE_ETHERNET = 0x00000009; return ni != null && ni.isConnected() == true && (ni.getType() & (ConnectivityManager.TYPE_WIFI | TYPE_ETHERNET)) != 0; } public static boolean isConnectedUsingWifi() { Context context = FileManagerApplication.getInstance(); ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = cm.getActiveNetworkInfo(); return ni != null && ni.isConnected() == true && ni.getType() == ConnectivityManager.TYPE_WIFI; } public static InetAddress intToInet(int value) { byte[] bytes = new byte[4]; for (int i = 0; i < 4; i++) { bytes[i] = byteOfInt(value, i); } try { return InetAddress.getByAddress(bytes); } catch (UnknownHostException e) { // This only happens if the byte array has a bad length return null; } } public static byte byteOfInt(int value, int which) { int shift = which * 8; return (byte) (value >> shift); } FileManagerApplication.java package com.mediatek.filemanager;import java.net.InetAddress;import android.app.Application;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.content.pm.PackageManager.NameNotFoundException;import android.util.DisplayMetrics;import android.util.Log;import android.view.WindowManager;import com.mediatek.filemanager.service.FileManagerService;import com.mediatek.filemanager.utils.FileUtils;import com.mediatek.filemanager.utils.LogUtils;import com.mediatek.filemanager.utils.PDebug;public class FileManagerApplication extends Application { public static final String TAG = "FileManagerApplication"; private static FileManagerApplication mInstance; private final int NOTIFICATIONID = 7890; private static int mScreenWidth; @Override public void onCreate() { PDebug.Start("FileManagerApplication - onCreate"); super.onCreate(); mInstance = this; if (startService(new Intent(this.getApplicationContext(), FileManagerService.class)) == null) { LogUtils.e(TAG, "startService Fails"); } PDebug.End("FileManagerApplication - onCreate"); } public static Context getInstance() { return mInstance; } public static int getScreenWidth() { DisplayMetrics dm = new DisplayMetrics(); WindowManager wm = (WindowManager) mInstance.getSystemService(Context.WINDOW_SERVICE); wm.getDefaultDisplay().getMetrics(dm); mScreenWidth = dm.widthPixels; return mScreenWidth; } /** * Get the version from the manifest. * * @return The version as a String. */ public static String getVersion() { Context context = getInstance(); String packageName = context.getPackageName(); try { PackageManager pm = context.getPackageManager(); return pm.getPackageInfo(packageName, 0).versionName; } catch (NameNotFoundException e) { Log.e(TAG, "Unable to find the name " + packageName + " in the package"); return null; } } public void setupNotification(Context context) { Log.d(TAG, "Setting up the notification"); // Get NotificationManager reference String ns = Context.NOTIFICATION_SERVICE; NotificationManager nm = (NotificationManager) context .getSystemService(ns); // get ip address InetAddress address = FileUtils.getLocalInetAddress(); if (address == null) { Log.w(TAG, "Unable to retreive the local ip address"); return; } String iptext = FileUtils.FTP + address.getHostAddress() + FileUtils.FTP_COLON + FileUtils.PORT; // Instantiate a Notification int icon = R.drawable.notification; CharSequence tickerText = String.format( context.getString(R.string.notif_server_starting), iptext); long when = System.currentTimeMillis(); Notification notification = new Notification(icon, tickerText, when); // Define Notification's message and Intent CharSequence contentTitle = context.getString(R.string.notif_title); CharSequence contentText = iptext; Intent notificationIntent = new Intent(context, FileManagerOperationActivity.class); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); notificationIntent.setAction(FileUtils.FTP_NOTIFICATION_ACTION); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); notification.flags |= Notification.FLAG_ONGOING_EVENT; // Pass Notification to NotificationManager nm.notify(NOTIFICATIONID, notification); Log.d(TAG, "Notication setup done"); } public void clearNotification(Context context) { Log.d(TAG, "Clearing the notifications"); String ns = Context.NOTIFICATION_SERVICE; NotificationManager nm = (NotificationManager) context .getSystemService(ns); nm.cancelAll(); Log.d(TAG, "Cleared notification"); }}CustomUnderLine.javapublic class CustomUnderLine extends View{ private static final String TAG = "CustomUnderLine"; private static final int TAB_COUNTS = 3; private Paint mPaint; private int mColor; private int mScreenWidth; private int mLineWidth; private int mCurIndex; private float mOffset; public CustomUnderLine(Context context) { super(context); } public CustomUnderLine(Context context, AttributeSet attrs) { super(context, attrs); mPaint = new Paint(); mPaint.setStrokeWidth(5); mColor = Color.argb(255, 0, 150, 136); mPaint.setColor(mColor); mScreenWidth = FileManagerApplication.getScreenWidth(); mLineWidth = mScreenWidth / TAB_COUNTS; Log.d(TAG,"mScreenWidth: "+mScreenWidth); Log.d(TAG,"mLineWidth: "+mLineWidth); } public void updateOffset(float offset,int index) { Log.d(TAG,"mOffset: "+mOffset); mOffset = (float)( index * mLineWidth + (offset * mScreenWidth) / TAB_COUNTS); invalidate(); } @Override public void draw(Canvas canvas) { super.draw(canvas); Log.d(TAG,"draw mOffset: "+mOffset); Log.d(TAG,"draw mLineWidth: "+mLineWidth); canvas.drawLine(mOffset, 0, (mOffset + mLineWidth), 0, mPaint); }}AbsbaseActivity.java extends activity {private void loadViews() { LayoutInflater inflater = LayoutInflater.from(this); mBrowseView = inflater.inflate(R.layout.browse, null); mFileView = inflater.inflate(R.layout.main, null); mFtpView = inflater.inflate(R.layout.ftp, null); if (mViews == null) { mViews = new ArrayList<View>(); } mViews.add(mBrowseView); mViews.add(mFileView); mViews.add(mFtpView); } private void bindWidgets() { mViewPager = (NoScrollViewPager) findViewById(R.id.viewpager); mTabBrowse = (TextView) findViewById(R.id.browse); mTabFile = (TextView) findViewById(R.id.file); mTabFtp = (TextView) findViewById(R.id.ftp); mCustomUnderLine = (CustomUnderLine) findViewById(R.id.under_line); }} 此外引入jar包:ftpserver-core-1.0.6.jar log4j-1.2.14.jar mina-core-2.0.4.jar slf4j-log4j12-1.5.2.jar slf4j-api-1.5.2.jar
Android.mk文件中加:LOCAL_STATIC_JAVA_LIBRARIES := ftpserver \ log4j \ mina \ slf4japi \ slf4jlog4jinclude $(CLEAR_VARS)LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += ftpserver:libs/ftpserver-core-1.0.6.jar \ log4j:libs/log4j-1.2.14.jar \ mina:libs/mina-core-2.0.4.jar \ slf4japi:libs/slf4j-api-1.5.2.jar \ slf4jlog4j:libs/slf4j-log4j12-1.5.2.jarinclude $(BUILD_MULTI_PREBUILT)
阅读全文
0 0
- 文件管理添加选项FTP
- FTP文件管理模块
- 文件右键添加自定义选项
- Linux 右键菜单(添加新建文件选项)
- cPanel文件管理之创建FTP账户
- android 基于ftp远程文件管理
- Android:添加自己的应用到“分享”->"发送文件"选项
- 怎么在linux下makefile文件中添加调试选项
- javascript实现动态添加和删除文件上传选项
- Android:添加自己的应用到“分享”->"发送文件"选项
- xcode中向项目添加文件时的选项
- 通过文件操作自动添加server-u的ftp用户
- VS2008 添加高级保存选项(vs2008,vs2010文件菜单下没有高级保存选项)
- VS2008 添加高级保存选项(vs2008,vs2010文件菜单下没有高级保存选项)
- 面象对象知识 办公文件知识 管理FTP服务器
- 管理网站文件的首选当然是ftp
- git 用户管理文件 添加 提交
- 添加和删除选项
- python操作Excel读写--使用xlrd
- 【PMP认证考试之个人总结】第 6 章 项目成本管理
- Java基础
- Android6.0权限permission提醒工具类
- @rpath, @loader_path, @executable_path
- 文件管理添加选项FTP
- 深入分析Java ClassLoader原理
- Jetson TX1开发笔记(六):V4L2+OpenCV3.1以MJPG格式读取USB摄像头图像并实时显示
- 将hive查询到的结果插入动态分区表
- 离散题目1
- vue学习笔记
- Sublime Text编辑
- bat 脚本文件 ----2LINK/jlink脚本
- NSString 的基本用法