代碼地址以下:
http://www.demodashi.com/demo/15058.htmlhtml
在android系統不斷升級的過程當中,Sharepreferences存儲出現多中問題,其中有些是讀寫權限形成,有些是由於加密問題引發。下面介紹下SpUtil這個工具類,它是在Sharepreferences基礎上進行了封裝優化,具有存儲不一樣數據類型,而後有加密功能,使用簡單,在介紹的工程中,還會涉及到一些權限方面的講解。
存儲數據類型包括:
boolean、int、float、long、String,List,object,其中 存儲 String 具有加密功能,在存儲 object的時候,object 須要是可序列化的對象android
今天涉及的內容有:json
在android6.0 之前,咱們在設置讀寫權限的時候,須要在android mainfast.xml中作權限申請:數組
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
在android6.0之後,讀寫權限增長了動態申請,因而須要用到android動態權限申請,網上這方面知識不少,你們能夠搜搜,這裏就不詳細講解了。app
而後到了android7.0增長了 FileProvider 文件權限限制,須要在 mainfast 的配置文件中加入FileProvider註冊:ide
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/update_files" /> </provider>
而後在 res文件夾下建 xml文件 updat_files.xml(文件名本身定義,可是要與上面provider中的 meta-data 標籤對應的 resource引用一致)
updat_files.xml文件代碼以下:工具
<?xml version="1.0" encoding="utf-8"?> <resources> <paths> <external-path path="" name="download"/> </paths> </resources>
要是項目涉及到自動下載安裝的時候,則自動安裝代碼要改爲相似下面這樣:gradle
/** * 安裝軟件 * * @param file */ private void installApk(File file) { if (!file.exists()) { return; } Uri uri = null; Intent install = new Intent(Intent.ACTION_VIEW); install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // UpdateConfig.FILE_PROVIDER_AUTH 便是在清單文件中配置的authorities uri = FileProvider.getUriForFile(mContext, AUTHORITY_TAG, file); // 給目標應用一個臨時受權 install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else { uri = Uri.fromFile(file); } install.setDataAndType(uri, "application/vnd.android.package-archive"); mContext.startActivity(install); }
其中FileProvider.getUriForFile(mContext, AUTHORITY_TAG, file);中的 AUTHORITY_TAG 即爲 provider 註冊中的 android:authorities 值。優化
此版本開始後,增長了安裝未知權限的限制,因而須要在 mainfast.xml中添加安裝未知應用的權限:ui
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
android7.0以後的加密會出現問題,解決辦法的話,以前我已經講過,你們能夠參考個人文章 android-N在AES加密時出現:no such provider: Crypto 的問題
然而在android9.0出來後,加密這塊仍然不消停,加密機制切換,致使獲取祕鑰數組的方式改變,主要是加密byte數組的獲取,以及涉及加密類InsecureSHA1PRNGKeyDerivator,具體的你們能夠看demo中代碼
前面都講過,下面就具體到 SpUtil 工具類的使用了。
SpUtil做爲Sharepreferences的超級封裝類,具有存儲boolean、int、float、long、String,List及可序列化object功能,其中String還具有加密存儲功能。SpUtil涉及到Gson,若你項目中引用了Retrofit,則無需另外引用gson,若須要單獨引用gson,你須要在 項目的 gradle中添加gson引用:
//gson implementation 'com.google.code.gson:gson:2.8.5'
//設置祕鑰,祕鑰mak爲16位數字字母組合的字符串 SpUtil.setMAK(String mak);
//存儲 當數據類型爲String,int,boolean,float,long中任何一種的時候,put方法具有自動轉型功能 SpUtil.put(String key, Object object);
putObject(String key, Object object);
getObject(String key)
putJsonObject(String key, Object obj)
getJsonObject(String key)
getString(String key)
getInt(String key,int number)
getInt(String key)
getFloat(String key,float number)
getFloat(String key)
getLong(String key,long number)
getLong(String key)
getBoolean(String key,boolean flag)
getBoolean(String key)
putList(String keyName, List<?> list)
getList(String key);
removeKey(String key)
clear()
contains(String key)
下面貼出SpUtil在Mainactivity中調用的主要代碼:
//存儲boolean SpUtil.put("a", true); boolean a=SpUtil.getBoolean("a"); mTvBoolean.setText("存儲布爾:"+a); //存儲int SpUtil.put("b",10); int b=SpUtil.getInt("b"); mTvInt.setText("存儲int:"+b); //存儲float SpUtil.put("c",10f); float c=SpUtil.getFloat("c"); mTvFloat.setText("存儲float:"+c); //存儲long SpUtil.put("d",10L); long d=SpUtil.getLong("d"); mTvLong.setText("存儲long:"+d); //存儲String SpUtil.put("e", "KFC"); String e = SpUtil.getString("e"); mTvString.setText("存儲String:"+e); //存儲list List<String>list=new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); SpUtil.putList("f",list); List<String>list2= (List<String>) SpUtil.getList("f"); StringBuffer buffer=new StringBuffer(); for (int i = 0; i < list2.size(); i++) { buffer.append(list2.get(i)); } mTvList.setText("存儲list:"+buffer.toString()); //存儲對象 People people=new People(); people.setName("小明"); people.setAge(13); SpUtil.putObject("g",people); People p= (People) SpUtil.getObject("g"); mTvObj.setText("姓名:"+p.getName()+" 年齡:"+p.getAge());
項目結構圖
效果圖
SpUtil多樣加密存儲,兼容android9.0
代碼地址以下:
http://www.demodashi.com/demo/15058.html
注:本文著做權歸做者,由demo大師代發,拒絕轉載,轉載須要做者受權