Android学习笔记—— 十 、多媒体的基础使用 - 调用相机拍照
程序员文章站
2022-03-23 23:14:50
...
- 启动相机
//实例化一个File对象outputImage用于存储拍下来的照片
File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
try {
//因为是缓存图片,所以如果已存在就直接删除,接下来创建一个空文件
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//因为从Android 7.0开始直接使用本地真实路径的Uri被认为是不安全的
//需要使用特殊的内容提供器FileProvider来将outputImage封装成一个Uri对象
// 从而使用和内容提供器类似的机制保护数据
if (Build.VERSION.SDK_INT >= 24) {
//封装outputImage,第二个参数需要和在AndroidManifest文件中配置的provider的authority属性一样
imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.mediatest.fileprovider", outputImage);
} else {
//直接将outputImage转换为Uri对象
imageUri = Uri.fromFile(outputImage);
}
//以隐式Intent启动相机,通过putExtra方法设置将拍下来的照片存储到缓存文件中
// 使用startActivityForResult方法返回拍照结果
Intent intent_takePhoto = new Intent("android.media.action.IMAGE_CAPTURE");
intent_takePhoto.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent_takePhoto, TAKE_PHOTO);
-
特殊的内容提供器FileProvider的配置
在AndroidManifest文件中配置
<application
… >
<!-- 这里的配置内容除了authoritise是自己设定的,其他都是是固定格式。而且一般authorities属性值一般都是包名+fileprovider -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.mediatest.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
在res目录下新建目录xml,在xml目录中新建FileProvider的路径配置文件file_paths.xml
<!-- 这里的external-cache-path对应的是使用getExternalCacheDir方法获取到的目录 -->
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-cache-path name="take_photo" path="." />
</paths>
- 处理拍照结果
if (resultCode == RESULT_OK) {
//将拍下来的照片解析成Bitmap对象并显示
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
img_showPhoto.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}