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

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

 进入主题

首先要获取权限,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) {//已经有了权限 ,不需要申请}}

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

 @Overridepublic 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;} elsereturn "/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();// 指定开启系统相机的Actionintent.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>
’解决网这个问题之后

重写下面这个方法

    @Overridepublic 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() {@Overridepublic 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();//别忘了restoremCanvas.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();}}

Android 添加水印相册相关推荐

  1. android对象识别实验报告,Android 3相册实验报告.doc

    Android 3相册实验报告 中原工学院计算机学院 软件平台开发技术大作业 班 级: 软件121 作品名称: 3D相册 姓 名: 辛俊闪 学 号: 201200834101 指导教师: 刘凤华 20 ...

  2. Android拍照相册裁剪封装

    Android拍照相册裁剪封装 先列出来需要解决问题 展示效果 注意事项 代码 参考资料 最近用到从相机/相册选择图片的功能,这个功能虽然不复杂,网上的代码也一大堆,但是考虑到可能以后别的地方也会用到 ...

  3. android 相册分组,Android获取相册路径

    Android获取相册路径 (2015-10-14 16:14:38) 标签: android 开发 源代码 freetheory 相册路径 private void getPhotoThumbnai ...

  4. android点击选择相册,android: 从相册中选择照片

    虽然调用摄像头拍照既方便又快捷,但并不是每一次我们都需要去当场拍一张照片的. 因为每个人的手机相册里应该都会存有许许多多张照片,直接从相册里选取一张现有的照 片会比打开相机拍一张照片更加常用.一个优秀 ...

  5. android+获取相册列表,android 获取相册列表的实现(二)

    该项目实现的功能如下: 获取手机相册,点击每个相册之后进入该相册的图片列表界面,在图片列表界面可以实现图片多选,然后进入所选择的图片界面,在该界面内可 该项目实现的功能如下: 获取手机相册,点击每个相 ...

  6. java android 相册_基于安卓Android studio相册备份及管理系统的设计

    基于安卓Android studio相册备份及管理系统的设计(论文10000字,程序代码) 摘要:时代在不断地进步与发展着,用户手中的移动中终端越来越多的占据了人们的生活,可以说人们现在是十分依赖手机 ...

  7. android调用相册和摄像头,调用Android摄像头与打开相册

    以下为代码块: package com.example.demo; import java.io.File; import android.annotation.TargetApi; import a ...

  8. android 自定义相册选择,Android通过手机拍照或从本地相册选取图片设置头像

    像微信.QQ.微博等社交类的APP,通常都有设置头像的功能,设置头像通常有两种方式: 1.让用户通过选择本地相册之类的图片库中已有的图像,裁剪后作为头像. 2.让用户启动手机的相机拍照,拍完照片后裁剪 ...

  9. android 从相册或相机获取图片并且裁剪 支持android 7.0

    1.在res/xml目录中新建一个file_paths.xml <?xml version="1.0" encoding="utf-8"?> < ...

最新文章

  1. Linux 常用命令之系统信息
  2. ORA-01578和ORA-26040--NOLOGGING操作引起的坏块-错误解释和解决方案(文档ID 1623284.1)...
  3. python实现api server_使用Python的http.server实现一个简易的Web Api对外提供HanLP拼音转换服务...
  4. halcon 定位_HALCON高级篇:单个相机的尺寸测量
  5. SpringBoot2.1.9 分布式锁ShedLock
  6. 兼容IE与firefox的css 线性渐变(linear-gradient)
  7. 阿里P8架构师谈:分布式系统全局唯一ID简介、特点、5种生成方式
  8. Java继承_java练习本(20190617)
  9. 美企调查华为设备安全性,华为发长文质疑;摩根大通预计苹果2020年将推5G iPhone;谷歌拟联手Dish成立美国第四大运营商...
  10. 用位运算实现求绝对值-有效避开if-else判断
  11. 890. Find and Replace Pattern找出匹配形式的单词
  12. UML(Unified Modeling Language)统一建模语言--类图详解
  13. [渝粤教育] 龙岩学院 Web信息系统应用开发 参考 资料
  14. 一个简单的js作用域题目(原创)
  15. VS2010过期密钥
  16. NTC热敏电阻阻值-温度对照表
  17. Simulink Solver
  18. 免费资源分享(四)一万多个分类好的音效资源(3.4G)
  19. NLP Prompting for Text Classification(1)
  20. 谷歌浏览器双击打不开pdf问题

热门文章

  1. STC8单片机基于开源库读取mpu6050数据
  2. Vue中常用的内置指令及自定义指令
  3. 架构之家 2017年元旦祝福和17年分享规划
  4. 线下场景-内存(Android profiler + MAT + adb)
  5. 考勤表生成器(区分节假日版本)
  6. Solidworks2022学习版 设置中文
  7. 05 高性能网络设计专栏-网络原理
  8. 三种MySQL大表优化方案,过目不忘!
  9. ubuntu18.04+gtx1660ti+nvidia驱动+cuda10.1+cudnn7.6
  10. 炸串常规店对拼夜市经济,“夸父”能火多久?