废话不多说,直接进入主题,想要在android中实现拍照最简单饿方法就是New 一个 Intent 设置Action为android.media.action.IMAGE_CAPTURE 然后使用startActivityForResult(intent,REQUEST_CODE)方法进入相机。当然还有很多方式可以实现,大家可以在网上查找。但是要注意的是在进入相机前最好判断下sdcard是否可用,代码如下:
2
|
String state = Environment.getExternalStorageState();
|
3
|
if (state.equals(Environment.MEDIA_MOUNTED)) {
|
4
|
intent = new Intent( "android.media.action.IMAGE_CAPTURE" );
|
5
|
startActivityForResult(intent, REQUEST_CODE);
|
7
|
Toast.makeText(DefectManagerActivity. this ,
|
8
|
R.string.common_msg_nosdcard, Toast.LENGTH_LONG).show();
|
当拍照完成以后需要在onActivityResult(int requestCode, int resultCode, Intent data)方法中获取拍摄的图片,android把拍摄的图片封装到bundle中传递回来,但是根据不同的机器获得相片的方式不太一样,所以会出现某一种方式获取图片为null的想象,解决办法就是做一个判断,当一种方式不能获取,就是用另一种方式,下面是分别获取相片的两种方式:
01
|
Uri uri = data.getData();
|
03
|
photo = BitmapFactory.decodeFile(uri.getPath());
|
06
|
Bundle bundle = data.getExtras();
|
08
|
photo = (Bitmap) bundle.get( "data" );
|
10
|
Toast.makeText(DefectManagerActivity. this ,
|
11
|
getString(R.string.common_msg_get_photo_failure),
|
12
|
Toast.LENGTH_LONG).show();
|
第一种方式是用方法中传回来的intent调用getData();方法获取数据的Uri,然后再根据uri获取数据的路径,然后根据路径封装成一个bitmap就行了.
第二种方式也是用法中传回来的intent对象但是不再是调用getData();方法而是调用getExtras();方法获取intent里面所有参数的一个对象集合bundle,然后是用bundle对象得到键为data的值也就是一个bitmap对象.
通过上面两种方式就能获取相片的bitmap对象,然后就可以在程序中是用,如果你想把相片保存到自己指定的目录可以是用如下步骤即可:
首先bitmap有个一compress(Bitmap.CompressFormat.JPEG, 100, baos)方法,这个方法有三个参数,第一个是指定将要保存的图片的格式,第二个是图片保存的质量,值是0-100,比如像PNG格式的图片这个参数你可以随便设置,因为PNG是无损的格式。第三个参数是你一个缓冲输出流ByteArrayOutputStream();,这个方法的作用就是把 bitmap的图片转换成jpge的格式放入输出流中,然后大家应该明白怎么操作了吧,下面是实例代码:
01
|
String pictureDir = "" ;
|
02
|
FileOutputStream fos = null ;
|
03
|
BufferedOutputStream bos = null ;
|
04
|
ByteArrayOutputStream baos = null ;
|
06
|
baos = new ByteArrayOutputStream();
|
07
|
bitmap.compress(Bitmap.CompressFormat.JPEG, 100 , baos);
|
08
|
byte [] byteArray = baos.toByteArray();
|
09
|
String saveDir = Environment.getExternalStorageDirectory()
|
11
|
File dir = new File(saveDir);
|
15
|
File file = new File(saveDir, "temp.jpg" );
|
20
|
fos = new FileOutputStream(file);
|
21
|
bos = new BufferedOutputStream(fos);
|
23
|
pictureDir = file.getPath();
|
24
|
} catch (Exception e) {
|
30
|
} catch (Exception e) {
|
37
|
} catch (Exception e) {
|
44
|
} catch (Exception e) {
|
然后就是实现图片的上传功能,我这里是是用的apache的HttpClient里面的MultipartEntity实现文件上传具体代码如下:
11
|
public static String uploadSubmit(String url, Map<String, String> param,
|
12
|
File file) throws Exception {
|
13
|
HttpPost post = new HttpPost(url);
|
15
|
MultipartEntity entity = new MultipartEntity();
|
16
|
if (param != null && !param.isEmpty()) {
|
17
|
for (Map.Entry<String, String> entry : param.entrySet()) {
|
18
|
entity.addPart(entry.getKey(), new StringBody(entry.getValue()));
|
22
|
if (file != null && file.exists()) {
|
23
|
entity.addPart( "file" , new FileBody(file));
|
25
|
post.setEntity(entity);
|
26
|
HttpResponse response = httpClient.execute(post);
|
27
|
int stateCode = response.getStatusLine().getStatusCode();
|
28
|
StringBuffer sb = new StringBuffer();
|
29
|
if (stateCode == HttpStatus.SC_OK) {
|
30
|
HttpEntity result = response.getEntity();
|
32
|
InputStream is = result.getContent();
|
33
|
BufferedReader br = new BufferedReader(
|
34
|
new InputStreamReader(is));
|
36
|
while ((tempLine = br.readLine()) != null ) {
|
这里就基本上对图片上传就差不多了,但是还有一个问题就是图片上传完以后bitmap还在内存中,而且大家都知道如果,高清的图片比较大,而手机内存本来就有限,如果不进行处理很容易报内存溢出,所以我们应该把处理完的bitmap从内存中释放掉,这时候就需要调用bitmap的recycle();方法,调用这个方法的时候需要注意不能太早也不能太晚,不然会报异常,一般可以放在下一张图片生成前或者没有任何view引用要销毁的图片的时候下面是实例代码:
4
|
private void destoryBimap() {
|
5
|
if (photo != null && !photo.isRecycled()) {
|
首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置:
在AndroidManifest.xml中加入访问SDCard的权限如下:
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
转自:http://blog.csdn.net/yaoyeyzq/article/details/7254679