关于android调用相机的问题

个人学习过程中的总结与笔记,如果其中有什么不对的问题,欢迎指正;有什么交流的,欢迎留言;

首先,先说一些官方文档的东西。官方文档中,CANERA是一个高危的权限,需要这样声明:

这导致了一些人认为用相机是需要声明这个权限的。但是文档下面是有这样一句NOTE的:

大概的意思就是如果你是用你的应用去使用一个存在的相机应用,是不需要去声明这个权限的。也就是说,如果我们是开发一个相机(我不知道扫码算不算?)才需要去申请这个权限。

我们继续说调用相机的问题。


相机同样是用隐式Intent来调用的,它的action叫做:MediaStore.ACTION_IMAGE_CAPTURE。也就是说我们需要定义一个action为这个的Intent来启动。在看一下官方文档给出的内容:

关于android调用相机的问题_第1张图片

注意这里有一个EXTRA_OUTPUT,也就是说,我们要给intent一个putExtra的值,指定拍摄后的照片的存放路径。

此外,从这里可以看出,是使用startActivityForResult()来启动的,因为会返回数据。

而传入的这个URI是有几点要说的:

1:URI是文件存放的路径,初始路径当然是用File这个类来确定,而或许相对的位置则是用getExternalFilesDir()方法,具体如下:

关于android调用相机的问题_第2张图片

2.Uri的获取在skd24以前的获取方式是很简单的,只要通过:Uri uri = Uri.fromFile(path);就可以获取

3.在sdk24以上,则需要通过FileProvider.getUriForFile()来获取,其中FileProvider是一个提供器,需要在AndroidManifest.xml中声明,如下:

关于android调用相机的问题_第3张图片

而URI的具体获取如下:

注:红框标记的地方,我学习过程中写的不一致报错了。

此外,在执行之前,可以判断手机中是否有这个应用,可以通过下面的方法:

PackageManager manager = getActivity().getPackageManager();(注:这个方法是在fragment中使用的,在activity中不需要getActivity())

manager.resolveActivity(intent)

或者更简单的:intent.resolveActivity(getPackageManager()) != null来判断

完整调用代码如下:

关于android调用相机的问题_第4张图片

你可能感兴趣的:(关于android调用相机的问题)