关于android调用相机的问题

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

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

<uses-permission android:name="android.permission.CAMERA"/>

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

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

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


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

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

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

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

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

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

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

而URI的具体获取如下:

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

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

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

manager.resolveActivity(intent)

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

完整调用代码如下:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容