发表于: 2018-10-08 23:45:59
2 801
一、今天完成的事情
调用相机上传图片
要想调用相机,首先得获取权限,在安卓6.0之前,获取权限只需在AndroidManifest中添加一行
<!-- 获取相机权限 -->
<uses-permission android:name="android.permission.CAMERA" />
就行了,但是在6.0之后,官方加weil防止APP滥用权限,强了对权限的管控,凡是涉及到用户隐私和安全的危险权限和特殊权限都必须经过用户授权。
下面是一个简单的申请权限的流程
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(
MyApplication.getContext(), Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
MeActivity.this.requestPermissions(new String[]{Manifest.permission.CAMERA}, 1);
} else {
takePhoto();
}
} else {
takePhoto();
}
当我们在应用中第一次调用相机权限时,系统会弹出一个申请权限的对话框
获取到权限后就可以拍照了,在拍照之前还得考虑如何保存图片,Android7.0之前,可以直接调用Uri的
fromFile()方法将File对象转换为Uri对象,Uri中有文件的真实路径,但是在7.0之后,为了提高数据安全性,需要用内容提供器的getUriForFile()方法将File转换成转换成封装好的Uri对象,所以要根据系统版本来选择不同的方法。
public void takePhoto() {
File outPutImage = new File(getExternalCacheDir(), "identity_image.jpg");
try {
if (outPutImage.exists()) {
outPutImage.delete();
}
outPutImage.createNewFile();
} catch (IOException e){
e.printStackTrace();
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
imageUri = FileProvider.getUriForFile(MeActivity.this,
"com.example.forrestsu.logintest.fileprovider", outPutImage);
} else {
imageUri = Uri.fromFile(outPutImage);
}
//启动相机
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_PHOTO);
}
}
拍照完成后,结果会返回到onActivityResult()中
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case TAKE_PHOTO:
if (resultCode == RESULT_OK) {
try {Bitmap bitmap = BitmapFactory.decodeStream
getContentResolver().openInputStream(imageUri));
showIdentityIV.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
default:
break;
}
}
二、明天计划的事情
1. 完善拍照界面
2. 解决之前自定义筛选菜单的bug
三、遇到的问题
报错
android.os.FileUriExposedException: file:///storage/emulated/0/photo.jpeg exposed beyond app through
ClipData.Item.getUri()
网上查到的结果是Android7.0调用相机拍照会出现这个错误,解决办法是在Application的onCreat()方法中添加如下内容
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure();
但具体原理不明。
四、收获
申请权限、调用相机。
这两天完成的内容比较少,个人的学习效率很差。
评论