做項目用到Android自帶相機的地方蠻多,也經常看到羣裏有人在問。
所以決定把思路和代碼寫出來,以供自己以後參考。
第一步申請權限
xml裏面也要申請權限喲
6.0及以上都要申請危險權限,我是在github上找的一個依賴,挺好用的,只填寫需要的權限就可以了。
compile 'com.mylhyl:acp:1.1.7'
第二步。調用系統相機
獲得路徑,6.0以上要用ContentValues傳路徑過去,如果我們不傳路徑也可以通過onActivityResult的data獲得圖片,但是因爲data的數據量太小,出來的圖片都很模糊,就感覺像是擼多了。。。所以我們要傳一個路徑過去,讓拍好的照片保存起來。
private String mFilePath; public void starSystemPhone(UtilityBean utilityBean) { this.utilityBean = utilityBean; Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); mFilePath = Environment.getExternalStorageDirectory().getPath() + "/" + VersatileTool.getTime() + ".png";// 指定路徑 File file = new File(mFilePath); if (file != null) { if (Build.VERSION.SDK_INT >= 24) { ContentValues contentValues = new ContentValues(1); contentValues.put(MediaStore.Images.Media.DATA, mFilePath); Uri uri = getApplicationContext().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, Util.REQUEST_SYSTEM_TAKE); } else { intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); startActivityForResult(intent, Util.REQUEST_SYSTEM_TAKE); } } else TLog.error("沒有文件"); // Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // startActivityForResult(intent, Util.REQUEST_SYSTEM_TAKE); }
第三步。獲得返回值。因爲我們傳的是路徑,所以data是null。
就直接獲得文件判斷是否爲null,最好測試的時候轉成bitmap顯示出來。
調用7.0相機
前幾個步驟是一樣的,只是要添加以下東西。
因爲7.0不能直接獲得路徑,所以我們需要找個東西代替一下。
我背上的發現圖片會被壓縮,所以我這裏把代碼貼了出來,前面的name自定義,自己看得懂就好,後面填寫自己的包名。
<resources> <paths> <external-path name="my_images" path="Android/data/填寫自己的包名/" /> <!--<external-cache-path name="cache_download" path="Android/data/com.example.suyou_hsl_n/files/download"/>--> <external-path path="." name="external_storage_root" /> <files-path name="media"/> </paths> </resources>
那我們現在創建了新的路徑,所以現在要去讓系統知道7.0要獲得的是這個路徑。
這段代碼是寫在application裏的。
結束
有什麼問題,或者我哪一步寫錯,麻煩評論裏說。因爲很多東西我都是測試過了並沒有深究。