最近一直开发东西,每每想着要写最近积累的东西,一直拖着,今天终于下手写了,废话不多说,今天主要记录我用到的一些工具类今天新介绍一下水印相册(也是最近一直开发要用的东西)记录一下,方便使用,写的不好,还希望多指教批评
进入主题
首先要获取权限,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();
}
}