Android基礎——你不知道的事(同局域網共享手機文件夾)

晚上好鴨!!!

故事的開始

公司有個文件拷貝的需求,具體的效果和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是找不到對應的方法的去初始化的。
在這裏插入圖片描述
我菜找不到,害我今天都是關閉混淆去學習的。。。
在這裏插入圖片描述

GitHub項目地址

起碼生活

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章