assets目錄是Android的一種特殊目錄,用于放置APP所需的固定文件,且該文件被打包到APK中時(shí),不會被編碼到二進(jìn)制文件。
默認(rèn)創(chuàng)建的空項(xiàng)目是沒有這個(gè)目錄的,只需要通過File——>New——>Folder——>Assets Folder就可以創(chuàng)建,assets目錄下可以放置圖片,Html文件,Json文件等等,這個(gè)目錄下的文件如何使用?
1.訪問圖片
需求是這樣的,我再assets目錄下放置了幾張.jpg和.png格式的圖片,我需要把這些圖片的路徑讀取出來做為一個(gè)List返回,先看代碼:
public static List<String> getAssetPicPath(Context context) {
AssetManager am = context.getAssets();
String[] path = null;
try {
// "" 獲取所有,填入目錄獲取該目錄下所有資源,如需要獲取對應(yīng)的子文件夾內(nèi)容,可在這里設(shè)置
path = am.list("");
} catch (IOException e) {
e.printStackTrace();
}
List<String> pciPaths = new ArrayList<>();
for (int i = 0; i < path.length; i++) {
if (path[i].endsWith(".png") || path[i].endsWith("jpg")) {
pciPaths.add(path[i]);
}
}
return pciPaths;
}
可以看到,通過AssetManager先獲取了目錄下所有的文件路徑,然后再遍歷篩選出我們要的內(nèi)容,這個(gè)過程并不復(fù)雜,這里還需要注意,取出的圖片路徑如果需要加載到ImageView上顯示,需要這樣寫,我這里以使用Glide為例子:
String img_path =pciPaths.get(position);
//路徑頭部
String PATH_HEAD = "file:///android_asset/";
Glide.with(mContext)
.load(PATH_HEAD + img_path)
.into(imageView);
2.訪問Html文件
這個(gè)使用比較簡單,結(jié)合webView使用,就一行代碼的事情:
webView.loadUrl("file:////android_asset/test.html");
本地html文件通常也就是測試下原生與JavaScript交互的相關(guān)方法可行與否,一般正式的線上應(yīng)用,不怎么會 用到,android原生與Js交互也是很有意思的內(nèi)容,會在另一篇水文里介紹。
3.訪問Json文件
需求是,解析test.json文件,將獲取到的字典保存到本地?cái)?shù)據(jù)庫中,這種寫法一般都是開發(fā)階段構(gòu)建偽數(shù)據(jù)用,實(shí)際開發(fā)中肯定是通過數(shù)據(jù)接口來獲取的。
文件內(nèi)容是這個(gè),一個(gè)Json數(shù)組:
[
{
"name": "全部",
"key": "all",
"pid": "currentState"
},
{
"name": "自住",
"key": "r1Self",
"pid": "currentState"
},
{
"name": "租住",
"key": "r2Rent",
"pid": "currentState"
},
{
"name": "借住",
"key": "r3Borrow",
"pid": "currentState"
},
{
"name": "空置",
"key": "r4Empty",
"pid": "currentState"
}
]
讀取出完整的Json串,并解析為List,通過GreenDao保存到本地的數(shù)據(jù)庫:
public static void initDictionAry(Context context) {
DaoManager.getJFDictionaryDao().deleteAll();
//字典值偽數(shù)據(jù),先寫到本地,后面協(xié)調(diào)統(tǒng)一通過接口返回
AssetManager assetManager = context.getAssets();
try {
InputStreamReader inputStreamReader = new InputStreamReader(assetManager.open("test.json"), "UTF-8");
BufferedReader reader = new BufferedReader(inputStreamReader);
String line;
StringBuilder builder = new StringBuilder();
while ((line = reader.readLine()) != null) {
builder.append(line);
}
reader.close();
inputStreamReader.close();
//獲取到完整的 json串
String json = builder.toString();
//解析為list
List<JFDictionary> dictionaries = GsonUtils.fromJson(json, new TypeToken<List<JFDictionary>>() {
}.getType());
DaoManager.getJFDictionaryDao().saveInTx(dictionaries);
} catch (IOException e) {
e.printStackTrace();
}
}
核心是借助了AssetsManager和BufferReader來進(jìn)行讀取,這里還有一點(diǎn)補(bǔ)充的就是解析Json數(shù)組,是借助了TypeToken獲取到類型,通過GsonUtils來完成解析,這里把代碼貼一下,不再贅述:
public class GsonUtils {
private static Gson gson = new Gson();
public static <T> T fromJson(String json, Class clazz) {
return (T) fromJson(json, (Type) clazz);
}
public static <T> T fromJson(String json, Type type) {
return (T) gson.fromJson(json, type);
}
public static <T> T fromJson(Reader reader, Class clazz){
return (T) gson.fromJson(reader,clazz);
}
public static <T> T fromJson(Reader reader,Type type){
return (T)gson.fromJson(reader,type);
}
public static JsonElement toJson(Object object, Type typeOfSrc){
return gson.toJsonTree(object, typeOfSrc);
}
public static String toJson(Object o){
return gson.toJson(o);
}
}