android 6.0以上版本拍照功能实现
来源:互联网 发布:mac app store更新 编辑:程序博客网 时间:2024/04/29 09:26
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,功能实现!
0 0
- android 6.0以上版本拍照功能实现
- Android实现拍照功能。
- Android 实现拍照功能
- Android 实现拍照功能
- 实现android 手机拍照功能
- android 实现定时拍照功能
- android 实现定时拍照功能
- Android - 实现拍照,录像功能
- Android--拍照功能的实现
- android调用系统相机实现拍照功能
- android调用系统相机实现拍照功能
- android调用系统相机实现拍照功能
- android调用系统相机实现拍照功能
- 实现调用Android手机的拍照功能
- 实现调用Android手机的拍照功能
- android调用系统相机实现拍照功能
- android调用系统相机实现拍照功能
- Android手机拍照功能的实现
- win7x64下的redis安装与使用
- Lucene 工作原理 之倒排索引
- Batch Normalization解析(Caffe版)
- Android之实现视频播放
- Java抽象类的作用和使用
- android 6.0以上版本拍照功能实现
- 本地图片选择
- leetcode106~Construct Binary Tree from Inorder and Postorder Traversal
- 家庭的用电都是交流电,为何会有零线和火线的区别?
- 详解Hadoop核心架构HDFS+MapReduce+Hbase+Hive
- 第14章 线程机制:并发函数的使用--多线程Web服务器
- 用户画像分析
- Go语言TCP Socket编程
- JDBC(一) 简介与获取数据连接