调用系统相机首先在android项目中需要在AndroidManifest.xml中申明,即就是注册相机功能,因为在android的规定中调用硬件中的API需要先声明对这个API的调用当然也需要相关权限的获取。
//AndroidManifest.xml文件内容
<uses-permission android:name="android.permission.CAMERA" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- 注册相机功能,在别的程序Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);进行启动相机时也会选择是否启动该应用 -->
<intent-filter>
<action android:name="android.media.action.IMAGE_CAPTURE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
声明注册相机功能后,需要在你需要调用相机功能的activity中启用动态权限申请,也就是一般手机调用申请权限的步骤
//以下为onCreate方法下内容
//REQUEST_GPS为自定义int型静态常量;private final int REQUEST_GPS = 1;
//申请动态权限,这里的权限申请绑定在了全局控件
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS}
, REQUEST_GPS);
// 以下为自定义方法
// 拍照并显示图片
private void openCamera_1() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 启动系统相机
startActivityForResult(intent, REQUEST_CAMERA_1);
}
//以下为onactivity内的内容
if (requestCode == REQUEST_CAMERA_1) { // 判断请求码是否为REQUEST_CAMERA,如果是代表是这个页面传过去的,需要进行获取
Bundle bundle = data.getExtras(); // 从data中取出传递回来缩略图的信息,图片质量差,适合传递小图片
Bitmap bitmap = (Bitmap) bundle.get("data"); // 将data中的信息流解析为Bitmap类型
saveImageToGallery(bitmap);
ivShowPicture.setImageBitmap(bitmap);// 显示图片
StartView.setVisibility(View.GONE);
OperateView.setVisibility(View.VISIBLE);
}
上部分代码分解来看:
//以下为onCreate方法下内容
//REQUEST_GPS为自定义int型静态常量;private final int REQUEST_GPS = 1;
//申请动态权限,这里的权限申请绑定在了全局控件
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS}
, REQUEST_GPS);
在Oncreate方法里写入上述代码,Oncreate代码会在该activity运行时直接执行这里的动态权限申请,上述代码分别申请了:读写外部存储,相机调用,文件操作的权限
这里需要解释一下(REQUEST_GPS)设置逻辑,这里相当于该项目的权限申请唯一标识,也就是说在其他activity需要调用权限申请的时候仅需要更改这个唯一标识的值即可
// 拍照并显示图片
private void openCamera_1() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 启动系统相机
startActivityForResult(intent, REQUEST_CAMERA_1);
}
此为自定义函数,声明一个intent并启动硬件设备(Android设备)的系统相机,并开启回写
//以下为onactivity内的内容
if (requestCode == REQUEST_CAMERA_1) { // 判断请求码是否为REQUEST_CAMERA,如果是代表是这个页面传过去的,需要进行获取
Bundle bundle = data.getExtras(); // 从data中取出传递回来缩略图的信息,图片质量差,适合传递小图片
Bitmap bitmap = (Bitmap) bundle.get("data"); // 将data中的信息流解析为Bitmap类型
saveImageToGallery(bitmap);
ivShowPicture.setImageBitmap(bitmap);// 显示图片
StartView.setVisibility(View.GONE);
OperateView.setVisibility(View.VISIBLE);
}
对应上边的自定义函数的requestCode值,在完成相机操作后,会进入这个判断框,可以看到这里使用Bundle来接受数据,这里的ivShowPicture.setImageBitmap(bitmap);// 显示图片
就是对刚刚处理过后的数据进行展示,而ivShowPicture是一个Imageview用来接受图片信息的变量