android 6.0以上版本拍照功能实现
2017-02-21 10:54
381 查看
android 6.0及以上版本实现拍照功能的方法
步骤一:创建一个给予权限的Utils,Demo1如下:
private static String[] PERMISSIONS_CAMERA_AND_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; public static boolean isCameraPermission(Activity context, int requestCode){ if (Build.VERSION.SDK_INT >= 23) { int storagePermission = ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE); int cameraPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA); if (storagePermission != PackageManager.PERMISSION_GRANTED || cameraPermission!= PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions(context, PERMISSIONS_CAMERA_AND_STORAGE, requestCode); return false; } } return true; } /** * 获取bitmap * * @param filePath * @return */ public static Bitmap getBitmapByPath(String filePath, int w, int h) { FileInputStream fis = null; Bitmap bitmap = null; try { File file = new File(filePath); if (file.exists()) { fis = new FileInputStream(file); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, options); int originalWidth = options.outWidth;//图片原始宽度 int originalHeight = options.outHeight;//图片原始高度 if ((originalWidth == -1) || (originalHeight == -1)) return null; //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 int be = 1;//be=1表示不缩放 if (originalWidth > originalHeight && originalWidth > w) {//如果宽度大的话根据宽度固定大小缩放 be = (int) (originalWidth / w); } else if (originalWidth < originalHeight && originalHeight > h) {//如果高度高的话根据宽度固定大小缩放 be = (int) (originalHeight / h); } if (be <= 0) be = 1; options.inJustDecodeBounds = false; options.inSampleSize = be;//设置缩放比例 options.inPreferredConfig = Bitmap.Config.RGB_565; bitmap = BitmapFactory.decodeFile(filePath, options); } } catch (IOException e) { e.printStackTrace(); } catch (OutOfMemoryError e) { e.printStackTrace(); } finally { try { fis.close(); } catch (Exception e) { } } //return getBitmapByPath(filePath, bitmapOptions); return compressImage(bitmap); } /** * 质量压缩方法 * * @param image * @return */ public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 90; int bytes = baos.toByteArray().length; while ((bytes / 1024 > 100) && (options >= 20)) { //循环判断如果压缩后图片是否大于10kb,大于继续压缩 baos.reset();//重置baos即清空baos options -= 10;//每次都减少10 //第一个参数 :图片格式 ,第二个参数: 图片质量,100为最高,0为最差 ,第三个参数:保存压缩后的数据的流 image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中 bytes = baos.toByteArray().length; } image.recycle(); ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片 return bitmap; }
步骤二:点击拍照方法中调区这个权限Demo1,形如;
if (Demo1.isCameraPermission(ReceiptConfirmActivity.this, 0x007)) getCamera();
步骤三:请求权限回调
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case 0x007: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { byCamera(); } else { Toast.makeText(this, "拍照权限被拒绝", Toast.LENGTH_SHORT).show(); } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } }
步骤四:实现拍照方法
public void getCamera() { String savePath = ""; String storageState = Environment.getExternalStorageState(); if (storageState.equals(Environment.MEDIA_MOUNTED)) { savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/camera/"; File savedir = new File(savePath); if (!savedir.exists()) { savedir.mkdirs(); } } // 没有挂载SD卡,无法保存文件 if (savePath == null || "".equals(savePath)) { System.out.println("无法保存照片,请检查SD卡是否挂载"); return; } String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); //照片命名 String fileName = timeStamp + ".jpg"; File out = new File(savePath, fileName); Uri uri = Uri.fromFile(out); //该照片的绝对路径 imagePath = savePath + fileName; Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, 0x008); }
步骤五:显示照片
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 8) { if(imagePath!=null && resultCode == RESULT_OK){ ivGetGoodsPhoto.setImageBitmap(PermissionUtils.getBitmapByPath(imagePath,480,800)); } } }
Ok,功能实现!
相关文章推荐
- Android实现拍照及图片裁剪(6.0以上权限处理及7.0以上文件管理)
- android studio 适配android7.0 android 6.0拍照调用系统裁剪工具实现头像上传功能
- android 软件在线版本更新功能的实现
- Android app“版本更新”功能的前后端实现
- android调用系统相机实现拍照功能
- 怎么用程序实现调用Android手机的拍照功能
- android调用系统相机实现拍照功能
- 四十七、实现调用Android手机的拍照功能
- Android开发之手机拍照功能的实现(源代码分享)
- Android调用系统相机拍照,并且模仿实现水印相机简单功能
- Android Camera相机功能实现 拍照并保存图片
- Adobe (Acrobat)Reader 6.0以上版本支持对有特殊权限的PDF进行添加注释,填写标单以及保存的功能。
- Android开发之拍照功能实现(附源码)
- 实现调用Android手机的拍照功能
- android软件更新功能简易实现(未添加版本比较)
- Android相机开发(一)之预览拍照查看图片基本功能的实现
- Android开发之拍照功能实现(附源码)
- android调用系统相机实现拍照功能
- 利用BitmapCutter实现截取图片功能之修改加强版,兼容Jquery1.4.x以上版本
- android调用系统相机实现拍照功能