轉(zhuǎn)載出處:http://blog.csdn.net/chay_chan
關(guān)于
最近在軟件的維護(hù)和更新過程中扁瓢,了解到一些關(guān)于Android7.0的適配,在這里和大家分享一下补君,據(jù)我所知引几,需要對(duì)Notification、拍照挽铁、圖片的裁剪進(jìn)行適配
Notification
關(guān)于 Android7.0 Notication 增加的特性伟桅,在此我就不詳細(xì)說明了硅堆,因?yàn)殛P(guān)于這類介紹的文章,早有一些大牛已經(jīng)發(fā)布過了贿讹。我主要講的是我在應(yīng)用更新功能中使用 Notification 踩到的坑」宦樱可以這么說民褂,應(yīng)用更新功能對(duì)于每個(gè)上線App都必不少,因?yàn)锳pp的需求或者功能疯潭,都是會(huì)在不斷的變化和完善的赊堪。
我遇到的情況是:在 Android7.0 以下,以下代碼是顯示下載App新版本成功后的通知欄竖哩,點(diǎn)擊可以跳轉(zhuǎn)到安裝App的頁面:
以上代碼哭廉,在 Android7.0 以下,可以實(shí)現(xiàn)點(diǎn)擊通知欄攔跳轉(zhuǎn)到安裝App界面的功能相叁,但是在安卓7.0或以上遵绰,點(diǎn)擊事件就出現(xiàn)問題了,點(diǎn)擊通知欄沒有任何反應(yīng)增淹,通知欄也不會(huì)顯示椿访,但是會(huì)有error等級(jí)的log輸出,出現(xiàn) FileUriExposedException 這樣的異常虑润,原因是 Andorid7.0 的“私有目錄被限制訪問”成玫,“StrictMode API 政策”。
由于從 Android7.0 開始拳喻,直接使用真實(shí)的路徑的Uri會(huì)被認(rèn)為是不安全的哭当,會(huì)拋出一個(gè) FileUriExposedException 這樣的異常。需要使用 FileProvider,選擇性地將封裝過的Uri共享到外部冗澈。于是钦勘,需要對(duì)上面的代碼進(jìn)行修改:
以上代碼增加了對(duì)系統(tǒng)版本的判斷,如果是 Andorid7.0 或以上渗柿,則不再使用 Uri.fromFile()方法 獲取文件的Uri个盆,而是通過使用 FileProvider(support.v4提供的類) 的getUriForFile()。同時(shí)要添加多這么一行代碼 installIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
由于 FileProvider 是繼承 ContentProvider,屬于四大組件之一朵栖,需要在AndroidManifest.xml中配置颊亮,配置如下:
配置中的 authorities 按照江湖規(guī)矩一般加上包名,${applicationId}是獲取當(dāng)前項(xiàng)目的包名,前提是 defaultConfig{} 閉包中要有applicationId屬性陨溅。
標(biāo)簽中的 resource 填寫配置 fileprovider 的配置文件终惑,在res資源目錄下新建xml文件下,在該文件夾下創(chuàng)建 file_provider_paths.xml文件门扇,這個(gè)xml文件名并不是一定要這么起雹有,只要和清單文件中配置的文件名一致就行偿渡。
file_provider_paths.xml 的內(nèi)容如下:
上述代碼中path="",是有特殊意義的霸奕,它代碼根目錄溜宽,也就是說你可以向其它的應(yīng)用共享根目錄及其子目錄下任何一個(gè)文件了,如果你將 path 設(shè)為 path=”pictures”质帅, 那么它代表著根目錄下的 pictures目錄(eg:/storage/emulated/0/pictures)适揉,如果你向其它應(yīng)用分享 pictures目錄 范圍之外的文件是不行的。
完成上述的代碼修改和 FileProvider 的配置后煤惩,就可以兼容 Android7.0 或以上系統(tǒng)了嫉嘀,點(diǎn)擊通知欄可以跳轉(zhuǎn)到安裝App的界面了。到此魄揉,關(guān)于 Notification 在 Android7.0 的兼容就完成了剪侮。
拍照
在 Andorid7.0 以下,以下代碼可以實(shí)現(xiàn)跳轉(zhuǎn)到拍照界面的功能洛退,拍完照會(huì)在對(duì)應(yīng)開啟拍照界面的 Activity 中的 onActivityResult()方法 中回調(diào):
但是在 Android7.0 或者以上瓣俯,以上代碼在調(diào)用拍照功能的時(shí)候,會(huì)導(dǎo)致應(yīng)用Crash,會(huì)報(bào) FileUriExposedException 異常,需要對(duì)以上代碼進(jìn)行修改不狮,對(duì)使用App的系統(tǒng)版本進(jìn)行判斷降铸,修改后代碼如下:
修改完成后,在 Android7.0 或以上的手機(jī)調(diào)用就可以調(diào)用拍照功能了摇零,拍照完后推掸,在 onActivityResult() 回調(diào)中,imgFile就是保存拍照后圖片的文件對(duì)象驻仅,就可以進(jìn)行相應(yīng)的處理谅畅,比如說對(duì)圖片進(jìn)行裁剪。
圖片的剪裁
在 Android7.0 以下噪服,以下代碼可以調(diào)用手機(jī)自帶的圖片裁剪功能:
但是在 Android7.0 或以上毡泻,以上代碼就需要進(jìn)行修改,修改如下:
getImageContentUri()方法 具體如下:
由于自己將發(fā)起裁剪請求的方法進(jìn)行封裝粘优,所以在 onActivityResult() 中仇味,拍照完成后,如果需要對(duì)圖片進(jìn)行裁剪雹顺,則可以這么操作:
ImageTools 的 decodeUriAsBitmap() 方法丹墨,是將Uri轉(zhuǎn)換為Bitmap對(duì)象,具體的代碼如下:
FileUtils.saveBitmapByQuality()方法嬉愧,是對(duì)圖片進(jìn)行壓縮贩挣,第一個(gè)參數(shù)傳入的是圖片的Bitmap對(duì)象,第二個(gè)參數(shù)是壓縮的保留率,比如上面使用的是80王财,即壓縮后為原來的80%卵迂,則是對(duì)其壓縮了20%,具體的代碼如下:
上述代碼可以實(shí)現(xiàn)和兼容 Android7.0 或以上系統(tǒng)的拍照+裁剪圖片的功能了绒净。在這里順便把調(diào)用相冊功能寫貼出來吧见咒,畢竟實(shí)際開發(fā)中需要上傳圖片的時(shí)候,通常會(huì)讓用戶選擇是拍照或者從相冊中獲取挂疆。
如果需要在選擇完相冊圖片后對(duì)圖片進(jìn)行裁剪论颅,則可以像上面拍照代碼那樣,需要在 onActivityResult() 回調(diào)中囱嫩,發(fā)起裁剪請求。這里一次性貼出 onActivityResult 的處理:
好了漏设,寫到這里墨闲,我的第一篇博客終于完成了,花了接近四個(gè)小時(shí)郑口,因?yàn)檫@是屬于技術(shù)性的博客鸳碧,文字要求嚴(yán)謹(jǐn),所以不像寫作文那樣信手拈來犬性。不過我盡量將文章寫得通俗易懂瞻离,希望可以幫助到更多的人,之前雖然在做項(xiàng)目的時(shí)候乒裆,有寫過不少筆記套利,但是從來沒有寫過博客,要是有哪些地方寫得不夠好鹤耍,還請各位大牛提出意見肉迫,彼此交流和學(xué)習(xí)。
我之所以萌發(fā)寫博客的念頭稿黄,也是因?yàn)樵陂_發(fā)過程中查詢問題的時(shí)候喊衫,無意間看到郭霖(人稱郭神)的博客,于是一篇篇的看了他的博客杆怕,也逐漸了解他族购,對(duì)他非常敬佩,昨天問了他寫博客對(duì)提升能力有沒有幫助陵珍,他也推薦我寫博客寝杖,所以今天我寫了第一篇博客,希望可以一直堅(jiān)持下去撑教,畢竟我對(duì)于安卓開發(fā)朝墩,一直都很熱衷。