1请求以下权限
Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CAMERA,
manifest中注册
app动态请求两步都需要
2调起相机
Intent takePictureIntent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//确保有相机来处理Intentif(takePictureIntent.resolveActivity(getPackageManager())!=null){File photoFile=saveFileName();tempFile=photoFile;if(photoFile!=null){Uri photoURI=FileProvider.getUriForFile(getApplicationContext(),"com.Cingke.cameraMake.fileprovider",photoFile);takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI);startActivityForResult(takePictureIntent,0);}}
FileProvider的com.Cingke.cameraMake部分需要跟包名一样
在清单以及xml的配置
清单
<providerandroid:authorities="com.Cingke.cameraMake.fileprovider"android:name="androidx.core.content.FileProvider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths"></meta-data></provider>
res/xml
暴露部分根据实际情况配置
<?xml version="1.0" encoding="utf-8"?><paths xmlns:android="/apk/res/android"><external-path name="external_files" path="." /></paths>
3保存位置
String currentPath=null;private File saveFileName(){//File newFolder = this.getExternalFilesDir(Environment.DIRECTORY_PICTURES);SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");Date date = new Date(System.currentTimeMillis());String name =format.format(date)+".jpg" ;filename=name;File ji=null;try {ji=new File(newFolder+"/"+name);ji.createNewFile();currentPath=ji.getAbsolutePath();} catch (Exception e) {e.printStackTrace();}return ji;}
4返回结果处理
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if (requestCode == 0) {FileOutputStream o=null;Bitmap bitmap=BitmapFactory.decodeFile(currentPath);//显示image.setImageBitmap(bitmap);//图片在文件管理器打不开,需要移出应用私有目录才可查看}}