首页 > 其他分享 >直播平台搭建,Android手机拍照和手机相册选取图片的工具

直播平台搭建,Android手机拍照和手机相册选取图片的工具

时间:2023-01-16 14:12:30浏览次数:51  
标签:null 相册 new Bitmap import 手机 Android bitmap android

直播平台搭建,Android手机拍照和手机相册选取图片的工具

package com.shentaiwang.jsz.savepatient.util;
 
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.WindowManager;
import android.widget.Toast;
 
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
 
/**
 * Created by user on 2016/12/16.
 */
public class ImageUtil {
    public static final int CODE_SETHDIMG_ALNUM = 1;
    public static final int CODE_SETHDIMG_CAM = 2;
    public static final int CROP_IMG = 100;
 
    public File camImgFile = null;
    public File cropImgFile = null;
 
    public void gotoCam(Context context) {
        try {
        //获取当前系统的android版本号
        int currentApiVersion = android.os.Build.VERSION.SDK_INT;
 
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
        String str = dateFormat.format(new Date(System.currentTimeMillis()));
 
        //设置保存拍摄照片路径(DCIM/Camera/Modle_PictureWall_img_20170212_122223.jpg)
        //路径默认,若修改则不能保存照片
        camImgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "/Camera/Modle_PictureWall_img_" + str + ".jpg");
 
        Uri outputImgUriFromCam = null;
        if (currentApiVersion < 24) {
            outputImgUriFromCam = Uri.fromFile(camImgFile);
        } else {
            ContentValues contentValues = new ContentValues(1);
            contentValues.put(MediaStore.Images.Media.DATA, camImgFile.getAbsolutePath());
 
                outputImgUriFromCam = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
 
        }
 
        //跳转到照相机拍照
        Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        it.putExtra(MediaStore.EXTRA_OUTPUT, outputImgUriFromCam);
 
        ((Activity) context).startActivityForResult(it, CODE_SETHDIMG_CAM);
//        startActivityForResult(it,CODE_SETHDIMG_CAM);
        }catch (Exception e){
            Toast.makeText(context,"请开启摄像权限",Toast.LENGTH_SHORT).show();
        }
    }
 
 
    public void gotoAlbum(Context context) {
        Intent it = new Intent(Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
 
        ((Activity) context).startActivityForResult(it, CODE_SETHDIMG_ALNUM);
//        startActivityForResult(it,CODE_SETHDIMG_ALNUM);
    }
 
    public void cropImg(Context context, boolean isFromCam, boolean isSetHd, Intent data, String fileName) {
        File inputFile = null;
 
        if (isFromCam) {
            inputFile = camImgFile;
        } else {
            Log.d("ImageUtil", "cropImg:图片数据: "+data.getData());
            inputFile = new File(getRealPathFromURI(context, data.getData()));
        }
 
        //设置保存路径名称
        cropImgFile = new File(context.getExternalFilesDir(fileName), String.valueOf(System.currentTimeMillis()));
 
        WindowManager manager = ((Activity) context).getWindowManager();
        DisplayMetrics outMetrics = new DisplayMetrics();
        manager.getDefaultDisplay().getMetrics(outMetrics);
 
        Intent it = new Intent("com.android.camera.action.CROP");
        it.setDataAndType(getImageContentUri(context, inputFile), "image/*");
 
        it.putExtra("output", Uri.fromFile(cropImgFile));
        it.putExtra("crop", "true");
        it .putExtra("scale",true);//黑边
        it .putExtra("scaleUpIfNeeded",true);//黑边
 
 
        if (isSetHd) {
            // 裁剪框比例
            it.putExtra("aspectX", 1);
            it.putExtra("aspectY", 1);
 
            // 输出图片大小
            it.putExtra("outputX", outMetrics.widthPixels / 2);
            it.putExtra("outputY", outMetrics.widthPixels / 2);
        } else {
            // 裁剪框比例
            it.putExtra("aspectX", 3);
            it.putExtra("aspectY", 2);
 
            // 输出图片大小
            it.putExtra("outputX", 600);
            it.putExtra("outputY", 400);
        }
 
        // 返回格式
        it.putExtra("outputFormat", "JPEG");
 
        ((Activity) context).startActivityForResult(it, CROP_IMG);
//        startActivityForResult(it, CROP_IMG);
    }
 
    public String getRealPathFromURI(Context context, Uri uri) {
        String mImgPath;
        String[] filePathColumn = {MediaStore.Images.Media.DATA};
 
        Cursor cursor = context.getContentResolver().query(uri, filePathColumn, null, null, null);
        if(cursor!=null){
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();
            mImgPath=picturePath;
        }else{
            mImgPath=uri.getPath();
        }
        return mImgPath;
 
 
 
    }
 
    public Uri getImageContentUri(Context context, File imageFile) {
        String filePath = imageFile.getAbsolutePath();
        Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{"_id"}, "_data=? ", new String[]{filePath}, (String) null);
        if (cursor != null && cursor.moveToFirst()) {
            int values1 = cursor.getInt(cursor.getColumnIndex("_id"));
            Uri baseUri = Uri.parse("content://media/external/images/media");
            return Uri.withAppendedPath(baseUri, "" + values1);
        } else if (imageFile.exists()) {
            ContentValues values = new ContentValues();
            values.put("_data", filePath);
            return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        } else {
            return null;
        }
    }
 
    public void refreshAlbum(Context context, String path) {
        context.sendBroadcast(new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE", Uri.parse("file://" + path)));
    }
 
 
    public static byte[] bitmap2Bytes(Bitmap bm) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
        return baos.toByteArray();
    }
 
    /**
     * 根据byte数组生成文件
     *
     * @param bytes 生成文件用到的byte数组
     */
    public static boolean createFileWithByte(byte[] bytes) {
        String fileName = "portrait.png";
 
 
        // TODO Auto-generated method stub
        /**
         * 创建File对象,其中包含文件所在的目录以及文件的命名
         *
         */
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判断SDCard进行操作
            //获取SDCard指定目录下
            String sdCardDir = Environment.getExternalStorageDirectory() + "/CropImage/";
            File dirFile = new File(sdCardDir);//目录转换成文件夹
            if (!dirFile.exists()) {//如果不存在,就建立这个文件夹
                dirFile.mkdir();
            }
            File file = new File(sdCardDir, fileName);
            // 创建FileOutputStream对象
            FileOutputStream outputStream = null;
            // 创建BufferedOutputStream对象
            BufferedOutputStream bufferedOutputStream = null;
            try {
                // 如果文件存在则删除
                if (file.exists()) {
                    file.delete();
                }
                // 在文件系统中根据路径创建一个新的空文件
                file.createNewFile();
                // 获取FileOutputStream对象
                outputStream = new FileOutputStream(file);
                // 获取BufferedOutputStream对象
                bufferedOutputStream = new BufferedOutputStream(outputStream);
                // 往文件所在的缓冲输出流中写byte数据
                bufferedOutputStream.write(bytes);
                // 刷出缓冲输出流,该步很关键,要是不执行flush()方法,那么文件的内容是空的。
                bufferedOutputStream.flush();
            } catch (Exception e) {
                // 打印异常信息
                e.printStackTrace();
            } finally {
                // 关闭创建的流对象
                if (outputStream != null) {
                    try {
                        outputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (bufferedOutputStream != null) {
                    try {
                        bufferedOutputStream.close();
                    } catch (Exception e2) {
                        e2.printStackTrace();
                    }
                }
            }
            return true;
        }
        return false;
 
    }
 
    /**
     * 获取文件路径并转换成Bitmap
     *
     * @param filepath
     * @return
     */
    public static Bitmap getFilePath(String filepath) {
        File file = new File(filepath);
        Bitmap bm = null;
        if (file.exists()) {
            bm = BitmapFactory.decodeFile(filepath);
        }
        return bm;
    }
 
    public static Bitmap Bytes2Bitmap(byte[] bytes) {
        if (bytes.length != 0) {
            return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
        } else {
            return null;
        }
    }
 
    public static Bitmap toRoundCorner(Bitmap bitmap, float ratio) {//把正方形图片转化为圆形,ratio为2
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(rect);
        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        canvas.drawRoundRect(rectF, bitmap.getWidth() / ratio,
                bitmap.getHeight() / ratio, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);
        return output;
 
    }
 
    public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {
        int w = bitmap.getWidth();
        int h = bitmap.getHeight();
        Matrix matrix = new Matrix();
        float scaleWidth = ((float) width / w);
        float scaleHeight = ((float) height / h);
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
        return newbmp;
    }
 
 
    public static String savePhotoToSDCard(Bitmap bitmap) {
        String photoName = "";
        if (checkSDCardAvailable()) {
            // 图片时间命名
            SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
            Date date = new Date(System.currentTimeMillis());
            photoName = format.format(date);
            // 存储至DCIM文件夹下
            File dir = new File(Environment
                    .getExternalStorageDirectory() + "/Stw/temp/save/");
            if (!dir.exists()) {
                dir.mkdirs();
            }
 
            File photoFile = new File(dir.getAbsolutePath(), photoName + ".png");
            Bitmap photoBitmap = bitmap;
//            FileOutputStream fileOutputStream = null;
//            try {
//                fileOutputStream = new FileOutputStream(photoFile);
            if (photoBitmap != null) {
//                    double maxSize = 400.00;
                // 将bitmap放至数组中,意在bitmap的大小(与实际读取的原文件要大)
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                photoBitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos);
                int options = 80;//先压缩到80%
                while (baos.toByteArray().length / 1024 > 200) { // 循环判断如果压缩后图片是否大于200kb,大于继续压缩
                    if (options <= 0) {//有的图片过大,可能当options小于或者等于0时,它的大小还是大于目标大小,于是就会发生异常,异常的原因是options超过规定值。所以此处需要判断一下
                        break;
                    }
                    baos.reset();// 重置baos即清空baos
                    options -= 10;// 每次都减少10
                    bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);
                }
//                    byte[] b = baos.toByteArray();
//                    // 将字节换成KB
//                    double mid = b.length / 1024;
//                    // 判断bitmap占用空间是否大于允许空间 如果大于则压小于则不压缩
//                    if (mid > maxSize) {
//                        // 获取bitmap大小 是允许最大大小的多少
//                        double i = mid / maxSize;
//                        // 压缩 此处用到平方将宽带和高度压缩掉对应的平方根
//                        // 保持刻度和高度和原bitmap比率,压缩后也达到了大小占用空间的大小)
//                        photoBitmap = zoomImage(photoBitmap,
//                                photoBitmap.getWidth() / Math.sqrt(i),
//                                photoBitmap.getHeight() / Math.sqrt(i));
//                    }
//                    if (photoBitmap.compress(Bitmap.CompressFormat.PNG, 100,
//                            fileOutputStream)) {
//                        fileOutputStream.flush();
//                        // fileOutputStream.close();
//                    }
                try {
                    FileOutputStream fos = new FileOutputStream(photoFile);
                    fos.write(baos.toByteArray());
                    fos.close();
                    baos.close();
                    return photoFile.getAbsolutePath();
                } catch (Exception e) {
 
                }
 
 
            }
//            } catch (FileNotFoundException e) {
//                photoFile.delete();
//                e.printStackTrace();
//            } catch (IOException e) {
//                photoFile.delete();
//                e.printStackTrace();
//            } finally {
//                try {
//                    if (fileOutputStream != null) {
//                        fileOutputStream.close();
//                    }
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
 
        }
 
        return null;
    }
 
    /**
     * 压缩图片
     */
    public static Bitmap zoomImage(Bitmap bgimage, double newWidth,
                                   double newHeight) {
        // 获取这个图片的宽和高
        float width = bgimage.getWidth();
        float height = bgimage.getHeight();
        // 创建操作图片用的matrix对象
        Matrix matrix = new Matrix();
        // 计算宽高缩放�?
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // 缩放图片动作
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width,
                (int) height, matrix, true);
        return bitmap;
    }
 
    //检查sd卡是否存在
    public static boolean checkSDCardAvailable() {
        return Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED);
    }
 
 
}
 
 

​ 以上就是直播平台搭建,Android手机拍照和手机相册选取图片的工具, 更多内容欢迎关注之后的文章

 

标签:null,相册,new,Bitmap,import,手机,Android,bitmap,android
From: https://www.cnblogs.com/yunbaomengnan/p/17055260.html

相关文章

  • VALID/READY 握手机制
    VALID/READY握手机制AXI总线共有5个独立的​​通道​​,分别为写地址,写数据,写回应,读地址,读数据通道。5条通道相互独立,有一些细小的差别,但共同使用一套握手机制:VALID/R......
  • android studio 报错com.android.build.api.transform.TransformException: java.lang
    报错com.android.build.api.transform.TransformException:java.lang.RuntimeException或者其他一些出现gradle报错字样,这是因为部分第三方库需要较高gradle版本才能跑起......
  • 交叉编译 linux x86_64 aarch64 Android8
    https://github.com/TanNang/tls-proxy#uthashcd/tmpgitclonehttps://github.com/troydhanson/uthash#base64cd/tmpgitclonehttps://github.com/aklomp/bas......
  • android开发day4
    Activity组件屏幕组件启停活动页面启动结束生命周期启动模式在活动之间传递信息显示隐式Intent显示跳转隐式跳转发送数据返回数据补充附加信息......
  • Android开发学习之路--Camera之初体验
      顾名思义Camera就是拍照和录像的功能,像微信里面,我们想拍照传一下照片,就可以通过camera来拍照,然后存储照片,发送给好友。那么微信的app里面是不会直接通过cameraapi来......
  • Android开发学习之路--数据持久化之初体验
      上班第一天,虽然工作上处于酱油模式,但是学习上依旧不能拉下,接着学习android开发吧,这里学习数据持久化的知识。  其实数据持久化就是数据可以保存起来,一般我们保存......
  • Android开发学习之路--UI之初体验
      之前都是学习Activity,对于布局都没有做过学习,这里就简单学习下吧。下面看下AndroidStudio下有哪些控件:  这里分为Widgets,TextFields,Containers,Date&Time和Exp......
  • Android开发学习之路--Activity之Intent
      窗外再次飘起了小雪,还有1周就过年了,2016年即将到来,来年不知道自己将身处何处,船到桥头自然直吧。还是继续学习吧,上次学习了Activity,那么如果是两个Activity之间,怎么从......
  • Android开发学习之路--Android Studio项目目录结构简介
       既然已经搭建好环境了,那就对AndroidStudio中项目目录结构做个简单的了解了,这里以最简单的Hello工程为例子,新建好工程后看如下三个工程视图:1、Android工程manifest......
  • Android开发学习之路--Activity之初体验
      环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看an......