android檔案管理器模組開發,細節整理

2021-08-21 10:34:13 字數 3271 閱讀 9518

intent intent =new intent(intent.action_open_document_tree);

startactivityforresult(intent, 42);

getcontentresolver().takepersistableuripermission(treeuri,

intent.flag_grant_read_uri_permission |

intent.flag_grant_write_uri_permission);

開啟系統自帶的activity來讓使用者授權,使用者授權後,對授權結果的處理,也比較麻煩,因為這個系統自帶的activity可以允許使用者只授權某個資料夾的寫許可權,而不是我們期望的整個外接sdcard的寫許可權。

public boolean issdcardwritable() 

string tempfilepath = getexternalstoragepath() + file.separator + "test.txt";

file file = new file(tempfilepath);

try catch (exception e)

boolean result = file.canwrite();

if (file.exists())

if (!result && haslollipop())

return result;

}public static boolean haslollipop()

public static documentfile createdocumentfile(@nonnull context context, @nonnull final file file, final boolean isdirectory)

boolean originaldirectory = false;

string basefolder = null;

string fullpath = null;

string relativepath = null;

try catch (ioexception e) catch (exception exception)

if (basefolder == null)

if (!basefolder.equals(fullpath)) else

uri treeuri = sharedpreferenceshelper.getinstance().getrootsdcarduri();

if (treeuri == null)

// start with root of sd card and

then parse through document tree.

try

if (originaldirectory)

string parts = relativepath.split("\\/");

for (int i = 0; i < parts.length; i++) else

}document = nextdocument;

}return

document;

} catch (securityexception e)

return

null;

}

從這個**可以知道file的表結構,1320行, db.execsql(「create table files (」 +

從2701行, insertdirectory 這個函式可以知道,

values.put(filecolumns.format, mtpconstants.format_association);
如果是folder, 那麼filecolumns.format 一定是 mtpconstants.format_association

之前也嘗試了根據size和mimetype列,來判斷記錄是否是folder,結果不行,因為雖然大多數folder的size都是0,但總有一些folder的size是大於零的, 雖然folder的mimetype列總是null,但總有一些檔案,mimetype列也是null

最後還是在組長的提示下發現了這個關鍵的insertdirectory函式,我本來已經沒招了,打算用笨辦法,

1. 找到乙個mimetype為null的檔案

2. 把這個檔案改為和乙個資料夾同名

3. 寫sql語句,這兩個記錄同時選出來,然後逐列對比,找出數值不同的列

public

static

void

notifymediascan(file file, context context)

static

private

void

getchildrenrecursive(file folder, arraylistoutput) }}

private

static

void

scanbymediaconnection(context context, string filearr)

});}

//update "file" table created in android.providers.media.mediaprovider

public

static

void

updatemediafiledb(context context, string filepath) else );

}if (build.version.sdk_int <= build.version_codes.m && file.isdirectory())

if (build.version.sdk_int > build.version_codes.lollipop_mr1)

} else

if (build.version.sdk_int >= build.version_codes.kitkat)

scanbymediaconnection(context, arr);

} else

}}

通過命令列手動更新 android 系統 media 資料庫

adb -s cb46b23f shell am broadcast -a android.intent.action.media_mounted -d file:///sdcard

前端模組管理器

目前,模組化結構已經成為web開發的主流形式,製作 的主要工作也不再是編寫各種功能,寫各種頁面,而是如何將各種不同的模組組合在一起,來完成整個web的功能 browser本身不具有模組管理機制,傳統的web開發中,為了進行模組化結構,不得不加 一大堆script標籤來依照先後順序來載入,這就造成了網...

Android布局管理器

android中的布局包括 線性布局 布局 相對布局 幀布局和絕對布局 上面的 就是介面布局的xml語句 主要是調整位置 這個表示 相對布局 android layout width wrap content 按鈕大小適應字型大小 android layout height wrap content...

android 布局管理器

1.豐富的介面由很多控制項組成,讓控制項不亂,我們借助布局來實現.布局是一種可用於放置很多控制項的容器,它按照一定規律調整內部控制項的位置,編寫精美介面,布局內部放置控制項外,也可以放置布局,通過多層布局巢狀,我們完成一些複雜的介面實現.2.相對布局 relativelayout 和linearla...