晚上好鴨!!!
故事的開始
公司有個文件拷貝的需求,具體的效果和es瀏覽器的網絡從PC訪問應該是一樣的
(一)點擊網絡
(二)點擊開啓服務
起初和小夥伴是有點懵逼的,但是百度瞭解一下,覺得還是有可行性的。就去查資料和學習,想辦法去實現這個功能。
Just to IT
準備工作
要想快速實現需求,就要用到前人的肩膀了。
1.先導入架包
項目app/libs中導入這六個架包,一個也不能少,我傻乎乎的測試過了。
2.在app/build.gradle中的android中添加代碼塊
android {
//...
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
}
}
創建服務(FtpService,記得清單文件註冊)
FtpService代碼如下
//記得導入自己的包
import android.app.Service;
import android.content.Intent;
import android.os.Environment;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.Toast;
import org.apache.ftpserver.FtpServer;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.ftplet.Authority;
import org.apache.ftpserver.ftplet.FtpException;
import org.apache.ftpserver.listener.ListenerFactory;
import org.apache.ftpserver.usermanager.impl.BaseUser;
import org.apache.ftpserver.usermanager.impl.WritePermission;
import java.util.ArrayList;
import java.util.List;
/**
* Created by syt on 2019/11/26.
*/
public class FtpService extends Service {
private FtpServer server;
private String user = "admin";//賬號,不需要賬號密碼就請設置爲anonymous
private String password = "123456";//密碼
private static String rootPath;//訪問路徑
private int port = 1234;//端口號
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
rootPath = Environment.getExternalStorageDirectory().getAbsolutePath();
try {
init();
Toast.makeText(this, "啓動ftp服務成功", Toast.LENGTH_SHORT).show();
} catch (FtpException e) {
e.printStackTrace();
Toast.makeText(this, "啓動ftp服務失敗", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onDestroy() {
super.onDestroy();
release();
Toast.makeText(this, "關閉ftp服務", Toast.LENGTH_SHORT).show();
}
/**
* 初始化
*
* @throws FtpException
*/
public void init() throws FtpException {
release();
startFtp();
}
public void startFtp() throws FtpException {
FtpServerFactory serverFactory = new FtpServerFactory();
//設置訪問用戶名和密碼還有共享路徑
BaseUser baseUser = new BaseUser();
baseUser.setName(user);
baseUser.setPassword(password);
baseUser.setHomeDirectory(rootPath);
List<Authority> authorities = new ArrayList<Authority>();
authorities.add(new WritePermission());
baseUser.setAuthorities(authorities);
serverFactory.getUserManager().save(baseUser);
ListenerFactory factory = new ListenerFactory();
factory.setPort(port); //設置端口號 非ROOT不可使用1024以下的端口
serverFactory.addListener("default", factory.createListener());
server = serverFactory.createServer();
server.start();
}
/**
* 釋放資源
*/
public void release() {
stopFtp();
}
private void stopFtp() {
if (server != null) {
server.stop();
server = null;
}
}
}
活動中的調用
MenuActivity
//彈出框的調用方式
initService();
AlertDialog.Builder alertDialog=new AlertDialog.Builder(MenuActivity.this);
alertDialog.setTitle("請使用完再點擊關閉服務器")
.setMessage(str)
.setCancelable(false)
.setNegativeButton("關閉服務器", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
stopService(new Intent(MenuActivity.this, FtpService.class));
}
})
.create();
alertDialog.show();
//下面是方法
private void initService() {
String ip = getIp();
if(TextUtils.isEmpty(ip)){
ToastUtil.showToast(MenuActivity.this,"獲取不到IP,請連接網絡");
}else{
str = "請在PC端瀏覽器上輸入網址訪問FTP服務\n" +
"ftp://"+ip+":1234";
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE);
}
}
startService(new Intent(this, FtpService.class));
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION_CODE) {
int snum=0;
for (int i = 0; i < permissions.length; i++) {
Log.i("MenuActivity", "申請的權限爲:" + permissions[i] + ",申請結果:" + grantResults[i]);
if (grantResults[i]==0)
snum+=1;
}
if (snum!=2){//說明權限申請沒申請成功,再次申請
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE);
}
}
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
stopService(new Intent(this, FtpService.class));
}
public String getIp(){
//獲取wifi服務
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
//判斷wifi是否開啓
if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
}
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ip = intToIp(ipAddress);
return ip;
}
private String intToIp(int i) {
return (i & 0xFF ) + "." +
((i >> 8 ) & 0xFF) + "." +
((i >> 16 ) & 0xFF) + "." +
( i >> 24 & 0xFF) ;
}
相信只要有點基礎的人,都能實現這個效果的
效果
1.app顯示
2.PC端瀏覽器訪問
今天就分享到這啦
需要注意的點
1.不需要訪問就設置賬號爲anonymous
給你們看看源碼怎麼寫的嘿嘿
2.記得添加專屬混淆,不然無法啓動服務
如果開啓混淆,沒添加架包的混淆保留,server是找不到對應的方法的去初始化的。
我菜找不到,害我今天都是關閉混淆去學習的。。。