一、項(xiàng)目概述
本次帶來的文件管理器,能夠?qū)D卡的目錄進(jìn)行管理。主要功能包括新建文件(夾)、查看文件(夾)、搜索文件(夾)、刪除文件(夾)、回到根目錄。涉及知識(shí)點(diǎn)包括動(dòng)態(tài)申請權(quán)限、自定義Dialog、自定義菜單、文件系統(tǒng)操作、適配器等。
二、開發(fā)環(huán)境
開發(fā)環(huán)境依舊是在Android Studio4.2.1,只要你的AS是近兩年從官網(wǎng)下載的,都是可以滿足的。日期版本是比4.2.1高的。
三、詳細(xì)設(shè)計(jì)
1、布局設(shè)計(jì)
我們先看下主頁面的布局:父標(biāo)簽是RelativeLayout,相對布局用來布置位置是最適合的。最上方使用Toolbar替代原生的ActionBar,在替代前需要在theme中將主題設(shè)置為Theme.MaterialComponents.Light.NoActionBar
,在MainActivity中加上代碼:
// 綁定并設(shè)置工具欄
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
然后放一個(gè)TextView顯示文件路徑,接著是最常用的ListView顯示文件列表,最后是一個(gè)父標(biāo)簽為LinearLayout的布局,里面描繪了一個(gè)搜索框。
我們再看下自定義對話框的布局,應(yīng)該一目了然,就是讓用戶輸入文件名稱,然后新建文件。
2、程序運(yùn)行時(shí)申請權(quán)限
Android6.0以后需要在運(yùn)行時(shí)申請讀寫外部存儲(chǔ)的權(quán)限(危險(xiǎn)權(quán)限)。首先在AndroidManifest.xml中加入我們需要的權(quán)限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
運(yùn)行時(shí)權(quán)限的核心在于程序運(yùn)行過程中由用戶授權(quán)我們?nèi)?zhí)行某些危險(xiǎn)操作,程序是不可以擅自做主去執(zhí)行這些危險(xiǎn)操作的。因此,第一步就是先判斷用戶是不是已經(jīng)給過我們授權(quán)了,借助的是ContextCompat.checkSelfPermission()
方法。checkSelfPermission()
方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)是Context,也就是上下文,第二個(gè)參數(shù)是具體的權(quán)限名,比如讀外存的權(quán)限名就是Manifest.permission.READ_EXTERNAL_STORAGE
,然后我們使用方法的返回值和PackageManager.PERMISSION_GRANTED
做比較,相等就說明用戶已經(jīng)授權(quán),不等就表示用戶沒有授權(quán)。
如果已經(jīng)授權(quán)的話就簡單了,直接去執(zhí)行查看文件的邏輯操作就可以了,我們把這部分操作封裝到了initFile()
方法當(dāng)中。如果沒有授權(quán)的話,則需要調(diào)用ActivityCompat.requestPermissions()
方法來向用戶申請權(quán)授權(quán),requestPermissions()
方法接收3個(gè)參數(shù),第一個(gè)參數(shù)是Activity實(shí)例,第二個(gè)參數(shù)是一個(gè)String數(shù)組,第三個(gè)參數(shù)是請求碼,只要是唯一值就可以了,這里傳入了1。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int myPermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE);
if (myPermission != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "請求讀取SD卡權(quán)限", Toast.LENGTH_SHORT).show();
// 動(dòng)態(tài)申請權(quán)限,請求碼為1
ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
} else {
initFile();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 同意權(quán)限則初始化文件列表
initFile();
} else {
// 拒絕權(quán)限
Toast.makeText(this, "你拒絕了讀寫SD卡權(quán)限", Toast.LENGTH_SHORT).show();
// 退出應(yīng)用
finish();
}
break;
default:
break;
}
}
3、查看文件
當(dāng)用戶同意權(quán)限之后,先判斷手機(jī)中是否裝載了sd卡,如果有sd卡則獲取SD卡的根目錄,設(shè)置當(dāng)前父目錄為root,獲取當(dāng)前目錄下的所有文件。然后for循環(huán)獲取所有的文件的鍵值對,添加到列表中,再創(chuàng)建和設(shè)置適配器。就大功告成了。
private void initFile() {
// 判斷手機(jī)中是否裝載了sd卡
boolean isLoadSDCard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if (isLoadSDCard) {
// 獲取SD卡的根目錄
root = Environment.getExternalStorageDirectory();
// 當(dāng)前父目錄為root
currentParent = root;
// 獲取當(dāng)前目錄的所有文件
currentFiles = currentParent.listFiles();
// 加載列表
inflatelv(currentFiles);
} else {
Toast.makeText(this, "SD卡沒有被裝載", Toast.LENGTH_SHORT).show();
}
// 設(shè)置列表子項(xiàng)監(jiān)聽器
setListener();
}
4、刪除文件
對于文件夾而言,需要先刪除目錄下所有文件,然后刪除當(dāng)前文件夾;對于文件而言,直接刪除當(dāng)前文件。使用deleteFile()
進(jìn)行文件刪除,接收參數(shù)為文件對象。在刪除之后需要重新設(shè)置適配器。
// 如果是文件夾先刪除目錄下所有文件
if (!currentFiles[i].isFile()) {
File[] files = currentFiles[i].listFiles();
for (int index = 0; index < files.length; index++) {
deleteFile(files[index].getName());
}
}
// 刪除當(dāng)前文件(夾)
if (currentFiles[i].delete()) {
Toast.makeText(view.getContext(), "刪除成功", Toast.LENGTH_SHORT).show();
currentFiles = currentParent.listFiles();
// 數(shù)據(jù)源發(fā)生改變,重新設(shè)置適配器內(nèi)容
inflatelv(currentFiles);
}
5、搜索文件
搜索的原理很簡單,就是關(guān)鍵詞篩選,contains()
方法判斷是否包含關(guān)鍵詞,將for循環(huán)得到的列表中每一個(gè)文件對象都放入File數(shù)組中,再重新設(shè)置適配器。
// 搜索按鈕進(jìn)行數(shù)據(jù)篩選,顯示關(guān)鍵詞數(shù)據(jù)源
ivSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String searchName = etSearch.getText().toString().trim();
List<File> tempFiles = new ArrayList<>();
for (int i = 0; i < currentFiles.length; i++) {
if (currentFiles[i].getName().contains(searchName))
tempFiles.add(currentFiles[i]);
}
File[] files = new File[tempFiles.size()];
for (int i = 0; i < tempFiles.size(); i++) {
files[i] = tempFiles.get(i);
}
inflatelv(files);
}
});
6、新建文件
file.createNewFile()
方法用來新建文件,file就是準(zhǔn)備新建的文件對象;mkdir()
方法用來創(chuàng)建文件夾,file就是準(zhǔn)備新建的文件夾對象。調(diào)用File的構(gòu)造方法,傳入?yún)?shù)為文件路徑。
// 創(chuàng)建個(gè)新文件對象,參數(shù)為文件路徑
File file = new File(currentParent.getAbsolutePath() + "/" + filename);
// 創(chuàng)建新文件夾
file.mkdir();
newBuildRefresh();
alertDialog.dismiss();
四、運(yùn)行演示
1、啟動(dòng)模擬器,運(yùn)行app,進(jìn)入應(yīng)用首先會(huì)申請?jiān)L問SD卡權(quán)限,如果拒絕將無法使用應(yīng)用,選擇允許進(jìn)入應(yīng)用。
2、可以看到屏幕中間顯示SD卡的所有目錄,當(dāng)前路徑為/storage/emulated/0。頂部工具欄左側(cè)是應(yīng)用名稱,右側(cè)是功能鍵,分別是返回上級(jí)菜單、返回根目錄、新建目錄;底部是搜索欄。
3、單擊子項(xiàng),如果是文件將提示“無法打開文件”;如果是文件夾:為空提示“文件夾為空”,不為空則進(jìn)入下一級(jí)目錄。這里我們進(jìn)入了Picture目錄。
4、長按子項(xiàng),彈出對話框,點(diǎn)擊確定即可刪除文件或文件夾。
5、點(diǎn)擊新建按鈕,下拉菜單選擇文件,輸入文件名稱,點(diǎn)擊新建按鈕,如果文件名重復(fù)會(huì)提示,不重復(fù)即可新建成功。
6、在搜索框輸入test,點(diǎn)擊搜索按鈕,出現(xiàn)搜索結(jié)果。
7、點(diǎn)擊搜索框的關(guān)閉按鈕,清空搜索結(jié)果,顯示原先的目錄。
8、點(diǎn)擊返回鍵返回到上級(jí)目錄,也可以使用中間的根目錄鍵直接返回根目錄。如果當(dāng)前是根目錄,再次點(diǎn)擊返回鍵就會(huì)退出應(yīng)用。文章來源:http://www.zghlxwxcb.cn/news/detail-675970.html
五、源碼獲取
關(guān)注公眾號(hào)《萌新加油站》,后臺(tái)回復(fù):文件管理
點(diǎn)此直接下載源碼:??Android Studio實(shí)現(xiàn)文件管理器文章來源地址http://www.zghlxwxcb.cn/news/detail-675970.html
??這有你錯(cuò)過的精彩內(nèi)容?? |
---|
Android Studio實(shí)現(xiàn)旅游App |
Android Studio實(shí)現(xiàn)購物商城 |
Android Studio實(shí)現(xiàn)選課系統(tǒng) |
Android Studio實(shí)現(xiàn)圖書管理系統(tǒng) |
Android Stduio實(shí)現(xiàn)外賣訂餐系統(tǒng) |
到了這里,關(guān)于Android Studio實(shí)現(xiàn)文件管理器的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!