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(); } }
阅读全文
2 0
- Android 添加水印相册
- Android:图片添加水印
- Android 图片添加水印
- Android添加图片水印
- Android 图片添加水印
- Android添加水印效果
- Android添加图片水印
- Android录制视频添加水印
- Android 为图片添加水印
- Android视频添加时间水印
- android 添加水印效果的实现
- android拍照压缩及添加水印3
- android 如何给图片添加水印
- Android:缩小图片尺寸,并添加水印
- android自定义相机添加自定义水印
- Android 图片添加水印图片或者文字
- android拍照压缩及添加水印3
- Android 录制视频添加时间水印
- Bigdata Development Database_Study_02(多表查询,外键,事务)
- 【JZOJ5287】【NOIP2017提高A组模拟8.16】最短路
- Python打印菱形
- linux 常用命令和进入计算机目录下
- 机器学习实战—逻辑回归
- Android 添加水印相册
- linux 写入文件夹权限
- Java内存管理
- 浅谈C++中的string 类型占几个字节
- 使用XShell和XFTP
- java多线程之synchronized与lock、wait与notify
- Python:实现2+22+222+2222+22222
- Java多线程(三)同步与锁定
- go笔记[2]--路由