1. 程式人生 > >Android N系統CTS verifier中cross profile相關測試項fail的解決方案

Android N系統CTS verifier中cross profile相關測試項fail的解決方案

         測試環境簡介:CTS verifier apk是對應Android N的版本。系統是Android N。          測試項名稱:camera support cross profile video capture (without extra output path)          測試過程:點選該項測試時,會呼叫到手機中安裝的相機拍攝視訊。拍攝視訊後返回到CTS verifier apk的介面進行視訊播放。如果能夠正常拍攝及播放視訊,則該測試項通過;否則,該測試項fail。           測試結果:能夠正常拍攝視訊,但是拍攝後回到CTS verifier apk介面不能正常播放,提示“cann't play the video”。 問題分析:仔細讀該測試項的名字,cross profile的意思是跨工作資料,這裡的工作資料應該是指跨應用程式。用"exception"為關鍵詞搜尋發生該問題的log,可能會發現的Log有“Security Exception”、“Permission Denial”,"can't read the uri"等。這些關鍵詞告訴我們是由於許可權問題導致了視訊的uri讀取不了所以導致視訊不能播放。           解決方案:
Android N增加了應用間檔案共享的許可權檢查,通過uri分享檔案變得更加嚴格。我們可以想到,CTS verifier apk先是通過startActivityForResult啟動了相機應用拍攝視訊。而相機應用會把拍攝下來的視訊的uri通過函式setResut(int resultCode, Intent intent)返回給CTS verifier應用。這裡就涉及到了跨應用的檔案共享。這裡會將uri資料儲存到intent中。在Android N之前的系統這麼寫是沒有問題的,而由於新增加了安全檢查,如果是Content Uri,這裡要在相機應用裡給intent加一個flag以授予讀取許可權。
          intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

通過增加該flag,CTS verifier即可正常訪問uri。該測試項也就能pass了。

上述方法只能針對Uri是Content Uri的情況,如果是File Uri,就需要用到FileProvider將File型別的Uri轉換成Content Uri,再通過上述方式授予讀取許可權。具體轉換方式網上有很多描述的文章,這裡不再贅述。