Android中Intent习惯用法

2019-12-10 19:42:07于丽

我们分析一下上面的代码片段:

不是所有的Android设备都能拍照的,所以首先我们调用了PackageManager的hasSystemFeature(PackageManager.FEATURE_CAMERA)方法,判断当前设备在硬件层级是否具有拍照的能力。

然后我们创建了一个action为MediaStore.ACTION_IMAGE_CAPTURE的intent对象。

然后我们通过调用intent.resolveActivity(pm)方法判断当前设备有无摄像机应用以便我们启动。如果没有摄像机应用但是我们却把intent对象传递给startActivity()或startActivityForResult()的话,就会抛出异常,应用崩溃退出。

我们自己写了一个createImageFile方法,通过该方法我们在自己的应用所对应的外设存储卡上创建了一个图片文件。需要注意的是,此步骤需要WRITE_EXTERNAL_STORAGE权限,在AndroidManifest.xml中注册如下:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
 android:maxSdkVersion="18"></uses-permission>

我们利用上面生成的图片文件生成了对应的Uri,将其存储在Activity中类型为Uri的字段imageOutputUri中,之后我们执行了intent.putExtra(MediaStore.EXTRA_OUTPUT, imageOutputUri),利用该Uri作为拍照完成后照片的存储路径。 
此处需要特别注意的是,一旦设置了存储路径,我们就不能在onActivityResult()中获取缩略图了。

最后我们需要调用方法startActivityForResult(intent, REQUEST_CODE_IMAGE_CAPTURE)以启动摄像机应用进行拍照,其中REQUEST_CODE_IMAGE_CAPTURE是我们自定义指定的用于拍照的requestCode。

我们覆写了onActivityResult方法,拍照完成后触发该方法的执行。首先我们要判断resultCode是否与RESULT_OK相等,只有相等才表明拍照成功,然后我们判断如果requestCode是否等于REQUEST_CODE_IMAGE_CAPTURE,若相等表明是拍照返回的结果。那么此时,我们就可以通过我们之前存储的imageOutputUri获取刚刚拍完的照片了,其URI字符串如: 
file:///storage/sdcard0/Android/data/com.ispring.commonintents/files/Pictures/JPEG_20150919_112704_533002075.jpg 
需要注意的是,如果我们在第5步之中设置MediaStore.EXTRA_OUTPUT作为照片输出路径的话,那么在onActivityResult中无法获取从摄像机应用换回的Intent,即为null,这样也就无法获取缩略图。反之,如果在第5步没有设置MediaStore.EXTRA_OUTPUT作为照片输出路径的话,intent不为空,可以尝试执行Bitmap thumbnail = intent.getParcelableExtra("data")获取缩略图,如果thumbnail不为空,表示能成功获取缩略图。但是有的手机并不会给拍照的图片生成缩略图,所以此处的thumbnail也有可能是null,所以在使用之前要先判断。