編輯:Android開發教程
最近,項目又做到,調用攝像頭拍照獲取圖片這個功能。
用以前的代碼直接用,發現在Android7.0上使用時會出現問題。
Android6.0之後,動態申請權限已成常態。
調用攝像頭拍照獲取圖片這個功能,需要動態申請 照相機權限、SD卡讀寫權限。
可是加了這些權限後,還是會報錯。
錯誤:android.os.FileUriExposedException: file:///storage/emulated.. exposed beyond app through Intent.getData()
這個是uri暴露錯誤。
從Android 7.0開始,一個應用提供自身文件給其它應用使用時,如果給出一個file://格式的URI的話,應用會拋出FileUriExposedException。這是由於谷歌認為目標app可能不具有文件權限,會造成潛在的問題。所以讓這一行為快速失敗。
網上有兩種解決方法:FileProvider方式 和 VmPolicy方式。
第一種是是谷歌官方推薦的解決方案,我這裡也是采用第一種方法。
步驟:1.在AndroidManifest.xml中添加如下代碼
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package=""> <application > <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application> </manifest>View Code
2.在res目錄下新建一個xml文件夾,並且新建一個provider_paths的xml文件
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!--"."表示所有路徑--> <external-path name="external_files" path="."/> </paths>View Code
3.使用到uri的代碼
Uri photoURI = Uri.fromFile(createImageFile()); 變成: Uri photoURI = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", createImageFile());View Code
修改代碼後,再次調試,程序正常運行。
ps:只是個小功能,網上也有不少資料,但還是自己總結一下比較好!
前段時間,我們做了一下Android的幾個動畫(http://blog.csdn.net/qq_25193681/article/details/51777248),對A
android中的很多游戲的游戲都使用了重力感應的技術,就研究了一下重力感應以屏幕的左下方為原點,箭頭指向的 方向為正。從-10到10,以浮點數為等級單位,想象以下情形:
我們已經了解了如何在自己的單個應用中調用activity。但是,android開發中比較重要的一點,就是使 用intent調用其他應用的activity。特別地,你的應用
自定義控件詳解(二):Path類 相關用法Path:路徑 繪制路徑:void drawPath (Path path, Paint paint) Path 可以繪制的路徑