个人学习过程中的总结与笔记,如果其中有什么不对的问题,欢迎指正;有什么交流的,欢迎留言;
首先,先说一些官方文档的东西。官方文档中,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来判断
完整调用代码如下: