下面这些内容是我在做一个项目中的一部分内容碰到的一些问题的总结
1.调用系统相机的2中方法(项目程序中都已经给出)
第一种:使用
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intent, 100);
这种方式,只是指定了相机对应的action,并没有传递其他的参数,对于这种方式,android的后台camera的代码中对他的操作
为:调用相关方法对拍到的照片进行压缩处理,最后转换成bitmap通过android相机activity对应的onresult()方法(
具体的过程我们不用理会)返回给我们自己的Activity,然后我们在发送方onActivityResult方法中就能够拿到这个bitmap,
方法内部如下:
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap)bundle.get("data");
在把它显示出来,但是我们发现这个bitmap内容已经是压缩过的,比较模糊,不过对付一般的应用已经够用了
第二种:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStorageDirectory(), "photo_camera.jpg");
uri = Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, 100);
通过android源码camera的分析(实际上我也没分析),发现在他内部的处理中,对于我们的intent请求,他会先判断是否有key:
MediaStore.EXTRA_OUTPUT(实际上就是“output”),如果我们没设置的话,他就会执行第一种方法来处理,如果我们设置的话,
就是这个第二种方法了(对于第二种方法,android照相机内部程序会根据我们传给他的uri,然后把照相对应的数据保存到这个uri对应的
文件中,之后直接返回通知我们(也就是发送方),但并不告诉我们相片在哪),因此我们需要自己封装一个file对应的uri,之后自己去对应
的file中把相片拿出来,因此就有了上面的这段代码,分析代码,思路如下:
把想要让相机存储相片的文件给指定下来,然后把文件转换成uri,把uri放进intent里面,通过startActivityForResult(intent, 100);
把uri告诉相机的activity.之后就等着相机的回应了,当发送方的onActivityResult方法被触发的时候,也就是说可以去拿相片了,
对应程序如下:
ImageView.setImageURI(uri);
因为uri是由发送方定义的,所以上面一步就可以把对应的相片给显示出来了。
2.ImageView和RotateImageView
在上面一步中我们拿到的相片在手机上显示的效果发现并不是理想的,我们需要对它进行旋转,这个时候ImageView达不到我们要的效果
通过对android源码的分析,我们发现RotateImageView.java文件,其中定义了RotateImageView类,其中有一个方法: