Android 添加水印相册

11 篇文章 0 订阅


最近一直开发东西,每每想着要写最近积累的东西,一直拖着,今天终于下手写了,废话不多说,今天主要记录我用到的一些工具类

今天新介绍一下水印相册(也是最近一直开发要用的东西)记录一下,方便使用,写的不好,还希望多指教批评

 进入主题

首先要获取权限,Android 6.0 需要动态获取权限,我主要写一下动态获取权限(网上也有很多方法)

 /**
     * 动态添加权限
     */
    public void getPression() {
        int checkSelfPermission = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (checkSelfPermission == PackageManager.PERMISSION_DENIED) {
            //没有权限,申请权限
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                            Manifest.permission.READ_EXTERNAL_STORAGE,//读外置存储权限
                    Manifest.permission.ACCESS_COARSE_LOCATION,//允许一个程序访问CellID或WiFi热点来获取粗略的位置
                    Manifest.permission.ACCESS_FINE_LOCATION,//允许一个程序访问精良位置(如GPS)
                    Manifest.permission.CAMERA,//请求访问使用照相设备
                    Manifest.permission.WRITE_SETTINGS,//允许程序读取或写入系统设置
                    Manifest.permission.RECORD_AUDIO,//允许程序录制音频
                    Manifest.permission.CALL_PHONE},//拨打电话
            100);
        } else if (checkSelfPermission == PackageManager.PERMISSION_GRANTED) {
            //已经有了权限 ,不需要申请
        }

    }



重写下面这个方法,动态申请权限就完成了

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 100:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(getContext(), "已经授权成功了", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

下面介绍拍照用到的方法

首先先创建一个存放水印相册的地址

创建文件夹

 * 获取SD卡或者内置存储空间可以保存资源的路径.
     *
     * @return 返回保存数据的路径, 有SD卡则是SD上的路径, 反之内置存储空间上的路径.
     */
    private String getSDPath() {
        //判断是否是SD卡
        boolean hasSDCard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
        if (hasSDCard) {
            return Constant.LOCAL_PHOTO_URL;
        } else
            return "/hrst";
    }

判断是否有这个文件夹

 * 判断是否有水印相册
     */
    private void createDirFile() {
        strPath = getSDPath();
        File destDir = new File(strPath);
        if (!destDir.exists() && !destDir.isDirectory()) {
            destDir.mkdirs();
            Log.i("wllpath", "saveImages: " + "创建了");
        } else {
            Log.i("wllpath", "saveImages: " + "已经存在了");
        }
    }

添加一个按钮,添加点击事件,进行拍照

/**
     * 拍照
     */
    public void takePicture() {
        Intent intent = new Intent();
        // 指定开启系统相机的Action
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
        //获取当前时间
        curDate = new Date(System.currentTimeMillis());
        String str = formatter.format(curDate);
        String pic_pathFileName = str + ".jpg";
        // 根据文件地址创建文件
        String pic_path = strPath + "/" + pic_pathFileName;
        file = new File(pic_path);
        // 把文件地址转换成Uri格式
        Uri photoURI = FileProvider.getUriForFile(getContext(),
                getActivity().getApplicationContext().getPackageName() + ".fileProvider",
                file);
        LogUtils.d("imgurl", file);
        // 设置系统相机拍摄照片完成后图片文件的存放地址
        intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
        //       Uri uri = Uri.fromFile(file);
        //intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        startActivityForResult(intent, 0);
    }

这里会遇到一个问题,标红的文字是为了解决Android 7.0 拍照保存到指定文件夹中

在AndroidManifest.xml添加如下代码

<!-- 在SD卡中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 配置7.0文件位置 -->
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="huaruishengtong.com.oa.fileProvider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>
’解决网这个问题之后

重写下面这个方法

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 0) {
            if (resultCode == Activity.RESULT_OK) {

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Bitmap bm = BitmapFactory.decodeFile(String.valueOf(file));
                        LogUtils.d("wlllthread", Thread.currentThread().getName());
                        FileOutputStream fos = null;
                        try {
                            fos = new FileOutputStream(file);
                            //添加时间水印
                            Bitmap newbm = WaterUtils.createBitmap(bm, time, PreferenceUtils.getString(getActivity(), UeserSP.LOGIN, ""), PreferenceUtils.getString(getActivity(), UeserSP.MOBILE, "123456789"), MyApplication.city);
                            newbm.compress(Bitmap.CompressFormat.JPEG, 50, fos);// 把数据写入文件
                            fos.flush();
                            fos.close();
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();

            }
        }
    }

这里有一个工具类--用于添加水印

public class WaterUtils {

    private static Paint textPaint;
    private static TextPaint paint1;

    /**
     * 进行添加水印图片和文字
     *
     * @param src 地址
     * @param time 拍照时间
     * @param userName 拍照水印的名字
     * @param num 水印的手机号
     * @param path 水印的地址
     * @return
     */
    public static Bitmap createBitmap(Bitmap src, String time, String userName, String num, String path) {
        if (src == null) {
            return src;
        }
        // 获取原始图片与水印图片的宽与高
        int w = (int) (src.getWidth() * 0.8);
        int h = (int) (src.getHeight() * 0.8);

        Bitmap newBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas mCanvas = new Canvas(newBitmap);
        // 往位图中开始画入src原始图片
        mCanvas.drawBitmap(src, 0, 0, null);
        // 在src的右下角添加水印
//        Paint paint = new Paint();
        Paint p = new Paint();
        //画圆角矩形
        p.setStyle(Paint.Style.FILL);//充满
        p.setColor(Color.parseColor("#22000000"));
        p.setAntiAlias(true);// 设置画笔的锯齿效果
        RectF oval3 = new RectF(0, h * 12 / 14, w, h);// 设置个新的长方形
        mCanvas.drawRoundRect(oval3, 0, 0, p);//第二个参数是x半径,第三个参数是y半径
        //paint.setAlpha(100);
        // 开始加入文字
        paint1 = new TextPaint();
        paint1.setColor(Color.WHITE);
        paint1.setTextSize(100);
        paint1.setAntiAlias(true);
        StaticLayout layout1 = new StaticLayout(time + "," + userName + "," + num + "\r\n" + path, paint1, w - 300, Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);
        // 这里的参数300,表示字符串的长度,当满300时,就会换行,也可以使用“\r\n”来实现换行
        mCanvas.save();
        mCanvas.translate(200, h * 12 / 14 + 50);//从100,100开始画
        layout1.draw(mCanvas);
        mCanvas.restore();//别忘了restore
//        StaticLayout layout = new StaticLayout(path, paint1, w*4/6+200,Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);
        // 这里的参数300,表示字符串的长度,当满300时,就会换行,也可以使用“\r\n”来实现换行
        mCanvas.save();
        mCanvas.translate(200, h * 11 / 14 + 200);//从100,100开始画
//        layout.draw(mCanvas);
        mCanvas.restore();//别忘了restore
        mCanvas.save(Canvas.ALL_SAVE_FLAG);
        mCanvas.restore();
        mCanvas = null;
        return newBitmap;
    }

    /**
     * 获取text的宽度
     *
     * @param paint
     * @param str
     * @return
     */
    public static int getTextWidth(Paint paint, String str) {
        int iRet = 0;
        if (str != null && str.length() > 0) {
            int len = str.length();
            float[] widths = new float[len];
            paint.getTextWidths(str, widths);
            for (int j = 0; j < len; j++) {
                iRet += (int) Math.ceil(widths[j]);
            }
        }
        return iRet;
    }

    /**
     * 获取texth高度
     *
     * @param paint
     * @param str
     * @return
     */
    public static int getTextHeight(Paint paint, String str) {
        Rect rect = new Rect();
        paint.getTextBounds(str, 0, str.length(), rect);
        int w = rect.width();
        int h = rect.height();
        return h;
    }
}


 这样就可以拍照了,并且是添加水印的图片哦,下面是拍出来的效果图 

下面介绍一下获取这个水印相册图片

/**
     * 获取图片
     *
     * @param strPath
     * @return
     */
    public List<String> getPictures(final String strPath) {
        List<String> list = new ArrayList<String>();
        File file = new File(strPath);
        File[] allfiles = file.listFiles();
        if (allfiles == null) {
            return null;
        }
        for (int k = allfiles.length-1; k >= 0; k--) {
            final File fi = allfiles[k];
            if (fi.isFile()) {
                list.add(fi.getPath());
            }
        }
        return list;
    }

调用这个方法就可以获取到你水印相册的图片,可以进行对其操作了

下面这个歌方法是删除文件的方法,有需要的可以看一下,只需要传入你要删除文件的地址即可

/**
     * 删除本地文件
     */

    public void myDeleteFile(String filePath) {
        File f = new File(filePath);
        if (f.exists()) {
            f.delete();
        }
    }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值