拍照(調用相機)
調用系統(tǒng)相機要注意的幾個問題:
-
Android 6.0+ 權限問題
- Android版本6.0以上(含6.0)需要申請權限
這里就貼下代碼:
首先加入權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/>
申請權限(這里除了相機權限,調用相冊還需要文件讀寫權限)
//檢查權限 int ret = ActivityCompat.checkSelfPermission(ActivateActivity.this, Manifest.permission .CAMERA); //申請權限 if (ret != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this,new String[] {Manifest.permission.android.Manifest.permission.CAMERA)}, RESULT_CODE_CAMERA); return; } } //回調 @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case RESULT_CODE_CAMERA: //TODO break;
- Android版本6.0以上(含6.0)需要申請權限
-
Camera API使用問題
- 在API21中Google發(fā)布了Camera2類來取代Camera類胆数,所以當API版本在21以上可使用Camera2漫蛔,API版本在21以下必須使用Camera欠橘;
-
Android7.0調用相機問題
-
android升級到7.0后對權限又做了一個更新即應用間傳遞文件時不允許出現(xiàn)以file://的形式 調用隱式APP引颈,需要用共享文件的形式:content:// URI,如果給出一個file://格式的URI的話,應用會拋出FileUriExposedException削茁。這是由于谷歌認為目標app可能不具有文件權限聪建,會造成潛在的問題,這里有兩種解決方式
-
使用共享文件的形式(FileProvider方式)
這是谷歌官方推薦的解決方案甚疟。即使用FileProvider來生成一個content://格式的URI仗岖。具體實現(xiàn)方式如下:-
在manifest文件中聲明
//android:name值是固定的 //android:authorities隨便寫但是必須得保證唯一性,這邊用的是包名 //android:grantUriPermission和android:exported 是固定值 <manifest> ... <application> ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.test.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> ... </application> </manifest>
-
在res文件夾下新建一個xml文件夾览妖,在xml文件夾下新建file_paths.xml文件
//paths標簽下的子元素一共有以下幾種: //files-path 對應 Context.getFilesDir() //cache-path 對應 Context.getCacheDir() //external-path 對應 Environment.getExternalStorageDirectory() //external-files-path 對應 Context.getExternalFilesDir() //external-cache-path 對應 Context.getExternalCacheDir() <paths xmlns:android="http://schemas.android.com/apk/res/android"> //name表示生成URI時的別名轧拄,path是指相對路徑。 <files-path name="my_images" path="images/"/> ... </paths>
-
使用
String filePath = Environment.getExternalStorageDirectory() + "/images/"+System.currentTimeMillis()+".jpg"; File outputFile = new File(filePath); if (!outputFile.getParentFile().exists()) { outputFile.getParentFile().mkdir(); } //創(chuàng)建content URI Uri imgUri = FileProvider.getUriForFile(this,"com.test.fileprovider", outputFile); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, imgUri); intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(FLAG_GRANT_WRITE_URI_PERMISSION); startActivityForResult(intent, REQUEST_TAKE_PICTURE); //在回調onActivityForResult中獲取圖片URI @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode){ case REQUEST_TAKE_PICTURE: Uri imgUri = FileProvider.getUriForFile(getActivity(), "com.test.fileprovider", mCameraFile); break; }
-
-
開啟嚴苛模式
Android 2.3提供一個稱為嚴苛模式(StrictMode)的調試特性讽膏,
它將報告與線程及虛擬機相關的策略違例檩电。一旦檢測到策略違例(policy violation),你將獲得警告府树,其包含了一個棧trace顯示你的應用在何處發(fā)生違例俐末。你可以強制用警告代替崩潰(crash),也可以僅將警告計入日志奄侠,讓你的應用繼續(xù)執(zhí)行卓箫;嚴格模式的開啟可以放在Application或者Activity以及其他組件的onCreate方法。為了更好地分析應用中的問題垄潮,建議放在Application的onCreate方法中烹卒。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder().detectFileUriExposure(); StrictMode.setVmPolicy(builder.build()); }
-
-