7.0拍照不能用主要是因为uri的问题,在这里就是通过FileProvider对uri进行了处理。代码如下:
package com.hzx.demo.activity; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.v4.content.FileProvider; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.hzx.demo.R; import com.hzx.demo.util.ToastUtil; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION; public class EightActivity extends AppCompatActivity implements View.OnClickListener{ @BindView(R.id.tv_pic) TextView tv_pic; @BindView(R.id.tv_camera) TextView tv_camera; @BindView(R.id.iv) ImageView iv; private Uri cameraUri, cropUri; private final int CODE_PIC = 0; private final int CODE_CAMERA = 1; private final int CODE_CROP = 3; private final int CODE_PERMISSION = 4; private boolean FLAG_PERMISSION = false; private List<String> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_eight); ButterKnife.bind(this); tv_pic.setOnClickListener(this); tv_camera.setOnClickListener(this); //6.0以后需要获取权限 obtainPermission(); } //获取权限 private void obtainPermission() { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { list = new ArrayList<>(); if(checkSelfPermission(Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) { list.add(Manifest.permission.CAMERA); } if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { list.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if(list.size()!=0) requestPermissions(list.toArray(new String[list.size()]),CODE_PERMISSION); } else FLAG_PERMISSION = true; } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); Log.d("test",Arrays.toString(grantResults)); for(int i=0;i<grantResults.length;i++) { if (grantResults[i] == -1) { FLAG_PERMISSION = false; break; } } FLAG_PERMISSION = true; } @Override public void onClick(View v) { if(!FLAG_PERMISSION) { ToastUtil.toastShort("请先获取权限"); return; } switch (v.getId()) { case R.id.tv_pic: openPhoto(); break; case R.id.tv_camera: openCamera(); break; } } //打开相机 private void openCamera() { Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); File file = new File(Environment.getExternalStorageDirectory(),"temp.jpg"); if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N) {
//注意需要跟provider中的authorities一行 cameraUri = FileProvider.getUriForFile(this, "com.hzx.demo.fileprovider", file); } else { cameraUri = Uri.fromFile(file); } intent.putExtra(MediaStore.EXTRA_OUTPUT,cameraUri); startActivityForResult(intent,CODE_CAMERA); } //打开相册 private void openPhoto() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, CODE_PIC); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case CODE_PIC: cropPhoto(data.getData()); break; case CODE_CAMERA: cropPhoto(cameraUri); break; case CODE_CROP: try { iv.setImageBitmap(MediaStore.Images.Media.getBitmap(getContentResolver(),cropUri)); } catch (IOException e) { e.printStackTrace(); } break; } } //剪切图片 private void cropPhoto(Uri uri) { Log.d("test","uri:"+uri.toString()); File file = new File(Environment.getExternalStorageDirectory(),"cropImage.jpg"); if(file.exists()) file.delete(); try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } Intent intent = new Intent("com.android.camera.action.CROP"); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); } cropUri = Uri.fromFile(file); intent.setDataAndType(uri,"image/*"); //裁剪图片的宽高比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("crop", "true");//可裁剪 // 裁剪后输出图片的尺寸大小 //intent.putExtra("outputX", 400); //intent.putExtra("outputY", 200); intent.putExtra("scale", true);//支持缩放 intent.putExtra("return-data", false); intent.putExtra(MediaStore.EXTRA_OUTPUT, cropUri); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//输出图片格式 intent.putExtra("noFaceDetection", true);//取消人脸识别 startActivityForResult(intent, CODE_CROP); } }
然后需要在清单文件进行配置:
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.hzx.demo.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> </provider>注意:![]()
file_paths代码:<?xml version="1.0" encoding="utf-8"?> <resources> <paths> <external-path path="." name="file_paths" /> </paths> </resources>