藉助系統自帶圖片裁剪集成圖片選擇以及7.0適配

NO IMAGE

一、前文

  之前使用的圖片裁剪功能一直是使用第三方的,也沒時間去思考自己寫一個的想法。後來無意間發現android自己本來就有裁剪功能,所以自己動手去集成了一把,並且把自己的權限封裝以及7.0的適配都加進去

二、注意的幾個點

  其實也沒有什麼好說的,基本沒有難度,只是有幾個需要注意的點
1.一個是7.0的文件安全機制,7.0之後android對於文件的安全增加了保護,在部分地方使用Uri會產生FileUriExposedException文件暴露異常。
2.其次,就是對於權限的封裝,只有拿到了權限才能進行操作,做好權限適配,這些下面會一併講到。

三、權限封裝

  權限封裝最好封裝到一個方法裡面,獨立處理權限,這樣也可以比較輕鬆的集成在BaseActivity裡面,在用的地方直接調,可以達到權限隨用隨取得效果。先看看關鍵代碼

android有兩個特殊權限,一個是WRITE_SETTINGS,另外一個是SYSTEM_ALERT_WINDOW,這裡只對WRITE_SETTINGS做了處理,我在想有沒有更優雅的方法把SYSTEM_ALERT_WINDOW加進去,所以後面會完善。
  在這裡處理了會觸發拒絕權限的彈框。但是當用戶點擊了不再詢問權限,就不會再彈框。android原生給我們提供了shouldShowRequestPermissionRationale()方法來判斷是否不再彈框。但是 這個方法會在部分手機上失效,比如我手中的魅族pro6手機,可能由於ROM問題,在調用該方法的時候就是失效的。那麼,我們可以用另外一種方法來達到相同的目的。
  我們可以直接調用requestPermissions方法,在onRequestPermissionsResult的權限回調方法中進行檢查,如果拒絕權限列表中還有這個權限的話,就可以進行彈框引導用戶去設置中手動打開。不但替代了shouldShowRequestPermissionRationale方法,而且在用戶一通拒絕之後還能給予提醒。下面是onRequestPermissionsResult方法的代碼

四、7.0文件安全機制

  不少安卓應用開發的程序員,一直都很少有機會接觸到安卓四大組件之一的Content Provider,但是由於android7.0文件安全機制的限制,使我們不得不去接觸這個組件。我個人覺得這也是一件好事情。不用再只侷限於部分組件的開發。
  首先我們需要在res文件下簡歷一個xml文件夾,然後再建立一個xml文件,這個xml文件名字自己可以隨便命名,這裡我命名為file_path。如下圖所示

藉助系統自帶圖片裁剪集成圖片選擇以及7.0適配

  file_path裡面的內容有事有講究的。裡面有一個root-path 節點,雖說android會提示element roo-path is not allowed here。但是我目前還沒有找到在不用這個節點的時候,能夠正常運行的手段。如果有哪位大神知道,可以指出。

然後,我們需要建立一個自己的provider。這樣在問題出現的時候有利於查找問題。最後,我們需要在Manifest裡面聲名這個Provdier。如下所示

這裡使用了${applicationId}來代替包名很方便,但是在java代碼中還是需要寫完全。
接下來說使用。使用起來就會變得很簡單,一句代碼就可以了

這個方法會返回Uri對象,在需要的地方進行使用。

五、如何調用相機、圖庫以及裁剪工具

相機和圖庫的調用,網上其實已經在很多地方寫爛了,我這裡直接貼出我的方法

接下來,在打開系統自帶裁剪工具的時候會有個坑,也是android 7.0的文件安全機制的問題。不過這個和之前的文件安全機制不一樣。使用FileProvider會提示”無法加載該圖片”。通過找到該圖片路徑可以瞭解到,android7.0的文件安全機制其實是希望能做成類似IOS沙盒機制的效果,每個app只能訪問自己的沙盒,但是從系統相冊拿到的圖片卻不屬於當前app本身,所以我們這時候就需要一個臨時授權。intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
調用系統裁剪功能的代碼如下

本文代碼:https://github.com/Kongdy/ImageCropBySystem
個人github地址:https://github.com/Kongdy
個人掘金主頁:https://juejin.im/user/595a64def265da6c2153545b
csdn主頁:http://blog.csdn.net/u014303003

相關文章

vuevuexvuerouter後臺項目——權限路由(超詳細簡單版)

基本數據結構梳理

android圖片裁剪拼接實現(一):Matrix基本使用

關於我對於寫博客寫文章的理解