Android多媒体之调用摄像头和从本地相册中选择图片

概述:

这个例程的实现的功能是:拍照,自动压缩图片,以及从本地相册选择图片。 需要加载权限:

>demo:.OnClickListener {private Button mButtonTakePhoto;private Button mButtonGetPhoto;private ImageView mImageViewPhoto;GET_PIC_FROM_CAMERA = 0x123;GET_PIC_FROM_GALLERY = 0X124;(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mButtonTakePhoto = (Button) findViewById(R.id.button_take_photo);mButtonGetPhoto = (Button) findViewById(R.id.button_get_photo);mImageViewPhoto = (ImageView) findViewById(R.id.imageView_camera);//mImageViewPhoto.setImageURI(Uri.fromFile(new File(“/mnt/sdcard/1442309575248.jpg”)));mButtonTakePhoto.setOnClickListener(this);mButtonGetPhoto.setOnClickListener(this);}(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case GET_PIC_FROM_CAMERA:if (resultCode == RESULT_OK) {ImageZip.zipImage(mFile.getAbsolutePath());//压缩图片mImageViewPhoto.setImageURI(Uri.fromFile(mFile));}break;case GET_PIC_FROM_GALLERY:if(resultCode==RESULT_OK){getImageFromGallery(data);}break;}}/*** 从本地相册中选择并得到相片*/(Intent data) {Uri selectedImage = data.getData();//用一个String数组存储相册所有图片String[] filePathColumn = { MediaStore.Images.Media.DATA };//用一个Cursor对象的到相册的所有内容Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null);cursor.moveToFirst();//得到选中图片下标int columnIndex = cursor.getColumnIndex(filePathColumn[0]);//得到所选的相片路径String picturePath = cursor.getString(columnIndex);//关闭Cursor,以免占用资源cursor.close();ImageZip.zipImage(picturePath);//一般相册中图片太大,不能直接显示,需要压缩图片//用一个ImageView展示该图片mImageViewPhoto.setImageBitmap(BitmapFactory.decodeFile(picturePath));}(View v) {switch (v.getId()) {case R.id.button_take_photo:getPictureFromCamera();break;case R.id.button_get_photo:/*Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.setType(“”);startActivityForResult(intent, GET_PIC_FROM_GALLERY);*///左起参数:选择行为权限,,系统本地相册URI路径Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//向onActivityResult发送intent,requestCode为GET_PIC_FROM_GALLERYstartActivityForResult(i, GET_PIC_FROM_GALLERY);break;}}/*** 向onActivityResult发出请求,的到拍摄生成的图片*/() {Intent intent = new Intent();intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//确定存储拍照得到的图片文件路径mFile = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + “.jpg”);try {mFile.createNewFile();} catch (IOException e) {e.printStackTrace();}//加载Uri型的文件路径intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mFile));//向onActivityResult发送intent,requestCode为GET_PIC_FROM_CAMERAstartActivityForResult(intent, GET_PIC_FROM_CAMERA);}}

压缩图片的类:

{/*** 压缩图片的方法*/(String savePath) {BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeFile(savePath, options);options.inSampleSize = computeInitialSampleSize(options, 480, 480 * 960);options.inJustDecodeBounds = false;Bitmap bitmap = BitmapFactory.decodeFile(savePath, options);try {FileOutputStream fos = new FileOutputStream(savePath);bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);fos.flush();fos.close();} catch (IOException e) {e.printStackTrace();}bitmap.recycle();bitmap = null;System.gc();}public static Bitmap getZipImage(String savePath){BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeFile(savePath, options);options.inSampleSize = computeInitialSampleSize(options, 480, 480 * 960);options.inJustDecodeBounds = false;Bitmap bitmap = BitmapFactory.decodeFile(savePath, options);bitmap.recycle();bitmap = null;System.gc();return bitmap;}(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {int initialSize = computeInitialSampleSize(options, minSideLength,maxNumOfPixels);int roundedSize;if (initialSize <= 8) {roundedSize = 1;while (roundedSize < initialSize) {roundedSize <<= 1;}} else {roundedSize = (initialSize + 7) / 8 * 8;}return roundedSize;}(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {double w = options.outWidth;double h = options.outHeight;int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength));if (upperBound < lowerBound) {// return the larger one when there is no overlapping zone.return lowerBound;}if ((maxNumOfPixels == -1) && (minSideLength == -1)) {return 1;} else if (minSideLength == -1) {return lowerBound;} else {return upperBound;}}}同生天地间,为何我不能。

Android多媒体之调用摄像头和从本地相册中选择图片

相关文章:

你感兴趣的文章:

标签云: