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...