android 拍照上传照片

以前用模拟器的摄像头的时候是可以拍照的,现在不知道怎么回事不行了:一下提供两种方法

一是:在创建AVD的时候设置摄像头支持

二是:

Google一把可以看到这个地方:http://stackoverflow.com/questions/2948809/emulators-camera-built-in-app-buggy-in-froyo-2-2 Emulator’s camera built-in app buggy in Froyo / 2.2?

里面也说是opengl的问题

找到/Camera/src/com/android/camera/ui/GLRootView.java这个文件

第177行改成 setEGLConfigChooser(5, 6, 5, 0, 0, 0);

然后再从模拟器里运行就可以了


NDK里的GL2JNIView.java的init函数里(大概102行)

// setEGLConfigChooser( translucent ?

// new ConfigChooser(8, 8, 8, 8, depth, stencil) :

// new ConfigChooser(5, 6, 5, 0, depth, stencil) );

setEGLConfigChooser(5, 6, 5, 0, 0, 0); 就可以跑起来了。 难道是config888模式不支持?

 

废话不多说,直接进入主题,想要在android中实现拍照最简单饿方法就是New 一个 Intent 设置Action为android.media.action.IMAGE_CAPTURE 然后使用startActivityForResult(intent,REQUEST_CODE)方法进入相机。当然还有很多方式可以实现,大家可以在网上查找。但是要注意的是在进入相机前最好判断下sdcard是否可用,代码如下:

1               destoryBimap();
2String state = Environment.getExternalStorageState();
3if(state.equals(Environment.MEDIA_MOUNTED)) {
4    intent =new Intent("android.media.action.IMAGE_CAPTURE");
5    startActivityForResult(intent, REQUEST_CODE);
6} else{
7    Toast.makeText(DefectManagerActivity.this,
8            R.string.common_msg_nosdcard, Toast.LENGTH_LONG).show();
9}

当拍照完成以后需要在onActivityResult(int requestCode, int resultCode, Intent data)方法中获取拍摄的图片,android把拍摄的图片封装到bundle中传递回来,但是根据不同的机器获得相片的方式不太一样,所以会出现某一种方式获取图片为null的想象,解决办法就是做一个判断,当一种方式不能获取,就是用另一种方式,下面是分别获取相片的两种方式:

01               Uri uri = data.getData();
02if(uri != null) {
03    photo = BitmapFactory.decodeFile(uri.getPath());
04}
05if(photo == null) {
06    Bundle bundle = data.getExtras();
07    if(bundle != null) {
08        photo = (Bitmap) bundle.get("data");
09    } else {
10        Toast.makeText(DefectManagerActivity.this,
11                getString(R.string.common_msg_get_photo_failure),
12                Toast.LENGTH_LONG).show();
13        return;
14    }
15}

第一种方式是用方法中传回来的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 ="";
02FileOutputStream fos = null;
03BufferedOutputStream bos = null;
04ByteArrayOutputStream baos = null;
05try{
06    baos =new ByteArrayOutputStream();
07    bitmap.compress(Bitmap.CompressFormat.JPEG,100, baos);
08    byte[] byteArray = baos.toByteArray();
09    String saveDir = Environment.getExternalStorageDirectory()
10            +"/temple";
11    File dir =new File(saveDir);
12    if(!dir.exists()) {
13        dir.mkdir();
14    }
15    File file =new File(saveDir, "temp.jpg");
16    file.delete();
17    if(!file.exists()) {
18        file.createNewFile();
19    }
20    fos =new FileOutputStream(file);
21    bos =new BufferedOutputStream(fos);
22    bos.write(byteArray);
23    pictureDir = file.getPath();
24} catch(Exception e) {
25    e.printStackTrace();
26} finally{
27    if(baos != null) {
28        try{
29            baos.close();
30        }catch(Exception e) {
31            e.printStackTrace();
32        }
33    }
34    if(bos != null) {
35        try{
36            bos.close();
37        }catch(Exception e) {
38            e.printStackTrace();
39        }
40    }
41    if(fos != null) {
42        try{
43            fos.close();
44        }catch(Exception e) {
45            e.printStackTrace();
46        }
47    }
48}

然后就是实现图片的上传功能,我这里是是用的apache的HttpClient里面的MultipartEntity实现文件上传具体代码如下:

01/**
02     * 提交参数里有文件的数据
03     
04     * @param url
05     *            服务器地址
06     * @param param
07     *            参数
08     * @return 服务器返回结果
09     * @throws Exception
10     */
11    publicstatic String uploadSubmit(String url, Map<String, String> param,
12            File file)throwsException {
13        HttpPost post =new HttpPost(url);
14  
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()));
19            }
20        }
21        // 添加文件参数
22        if(file != null&& file.exists()) {
23            entity.addPart("file",new FileBody(file));
24        }
25        post.setEntity(entity);
26        HttpResponse response = httpClient.execute(post);
27        intstateCode = response.getStatusLine().getStatusCode();
28        StringBuffer sb =new StringBuffer();
29        if(stateCode == HttpStatus.SC_OK) {
30            HttpEntity result = response.getEntity();
31            if(result != null) {
32                InputStream is = result.getContent();
33                BufferedReader br =new BufferedReader(
34                        newInputStreamReader(is));
35                String tempLine;
36                while((tempLine = br.readLine()) != null) {
37                    sb.append(tempLine);
38                }
39            }
40        }
41        post.abort();
42        returnsb.toString();
43    }

这里就基本上对图片上传就差不多了,但是还有一个问题就是图片上传完以后bitmap还在内存中,而且大家都知道如果,高清的图片比较大,而手机内存本来就有限,如果不进行处理很容易报内存溢出,所以我们应该把处理完的bitmap从内存中释放掉,这时候就需要调用bitmap的recycle();方法,调用这个方法的时候需要注意不能太早也不能太晚,不然会报异常,一般可以放在下一张图片生成前或者没有任何view引用要销毁的图片的时候下面是实例代码:

1/**
2     * 销毁图片文件
3     */
4    privatevoid destoryBimap() {
5        if(photo != null&& !photo.isRecycled()) {
6            photo.recycle();
7            photo =null;
8        }
9    }

转自:http://blog.csdn.net/yaoyeyzq/article/details/7254679

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值