Android 添加水印相册

来源:互联网 发布:网络开发公司有哪些 编辑:程序博客网 时间:2024/06/06 00:48


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

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

 进入主题

首先要获取权限,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();        }    }