解释全在代码中:
// 拍照上传 private OnClickListener mUploadClickListener = new OnClickListener() { public void onClick(View v) { // 调用相机 Intent mIntent = new Intent("android.media.action.IMAGE_CAPTURE"); // 图片存储路径,可自定义 File tmpFile = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg"); // 获取这个图片的URI originalUri = Uri.fromFile(tmpFile);//这是个实例变量,方便下面获取图片的时候用 mIntent.putExtra(MediaStore.EXTRA_OUTPUT, originalUri); startActivityForResult(mIntent, ACTIVITY_IMAGE_CAPTURE); } }; // 打开相册 private OnClickListener mPicListClickListener = new OnClickListener() { public void onClick(View v) { // 调用相册 Intent mIntent= new Intent(Intent.ACTION_GET_CONTENT); mIntent.addCategory(Intent.CATEGORY_OPENABLE); mIntent.setType(MIME_TYPE_IMAGE_JPEG); startActivityForResult(mIntent, ACTIVITY_GET_IMAGE); } }; 监听事件写好了,怎么调用不用我说了吧。这是个startActivityForResult事件,对应的我们肯定得有个onActivityResult,贴之 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) { return; } Bitmap bm = null; ContentResolver resolver = getContentResolver(); String filePath = "/sdcard/bengxin/bx_upload_tmp.jpg";//这个是暂存图片的路径 FileOutputStream output = null; try { // 创建暂存图片 if (Utils.CreateFile(filePath)) { output = new FileOutputStream(filePath); } else { throw new Exception("内部错误"); } if (requestCode == ACTIVITY_GET_IMAGE) { // 获得图片的uri originalUri = data.getData(); PS:拍照的那个URI我们在上面已经获取了 } /**** 获取图片开始 ****/ //mContent是上传的图片byte[]数组,得到这个后随便怎么处理,当然你也可以直接用fileInput流 fileInput = (FileInputStream) resolver.openInputStream(Uri .parse(originalUri.toString())); // 将图片内容解析成字节数组 mContent = getBytesFromInputStream(fileInput, 3500000); fileInput.close(); // 将字节数组转换为ImageView可调用的Bitmap对象 bm = getPicFromBytes(mContent, null); /********* 获取图片完了 ************/ // 将图片缩小到指定比例并且保存到缓存文件 float scale = ((float) 210) / ((float) bm.getWidth()); bm = Utils.smallBmp(bm, scale);//这个缩小功能是自己写的方法 //将Bitmap读到文件中去,注意这个是压缩,那个100是压缩比,0-100,越大质量越好 bm.compress(CompressFormat.JPEG, 100, output); output.flush(); output.close(); /*********为了更快速的将图片上传,将缩小后的图片保存到暂存文件***************/ fileInput = new FileInputStream(filePath); // 将图片内容解析成字节数组 mContent = getBytesFromInputStream(fileInput, 3500000); fileInput.close(); /*********************/ // 预览一下你的图片吧 bm = bm.createScaledBitmap(bm, mButtomUpload.getWidth() - 10, mButtomUpload.getHeight() - 10, true); mButtomUpload.setImageBitmap(bm); mButtomUpload.setPadding(2, 2, 2, 2); } catch (Exception e) { Utils.exceptionShow(CheckIn.this, e.getMessage()); } } 附赠两个方法,一个将字节转换成bitmap,一个获取byte[]数组 private static Bitmap getPicFromBytes(byte[] bytes, BitmapFactory.Options opts) { if (bytes != null) if (opts != null) return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts); else return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); return null; } private static byte[] getBytesFromInputStream(InputStream is, int bufsiz) throws IOException { int total = 0; byte[] bytes = new byte[4096]; ByteBuffer bb = ByteBuffer.allocate(bufsiz); while (true) { int read = is.read(bytes); if (read == -1) break; bb.put(bytes, 0, read); total += read; } byte[] content = new byte[total]; bb.flip(); bb.get(content, 0, total); return content; }