版权声明:本文为博主原创文章,如需转载请同Joern私信联系。 https://blog.csdn.net/sdsh1880gm/article/details/77774054
这一部分我们将探讨对于Android手机相机的调用以及当前屏幕截图的保存。
- 相机调用
- 照片显示
- 屏幕截屏与保存
1. 相机调用
1.1动态权限申请
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (getActivity().checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
//权限没有被授予
requestPermissions(new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CAMERA);
} else {//权限被授予
//拍照
}
}
和之前对于定位的申请流程一样,先判断当前版本,若是6.0之后,继续判断当前是否得到权限,若未得到则通过requestPermission去申请。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
//对于系统相机申请的回调
if (requestCode == PERMISSION_REQUEST_CAMERA) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//权限被授予
}
} else {
// Permission Denied
Toast.makeText(getActivity(), "Permission Denied", Toast.LENGTH_SHORT).show();
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
##1.2 相机调用
//拍照
Intent takeIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri photoUri = getMediaFileUri(TYPE_TAKE_PHOTO);
takeIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(takeIntent, TAKE_PHOTO_CODE);
//获取图片保存的文件地址和名称
public Uri getMediaFileUri(int type) {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "梅特勒");
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
return null;
}
}
//创建Media File
String timeStamp = new SimpleDateFormat("yyyyMMdd-HH:mm:ss").format(new Date());
File mediaFile;
if (type == TYPE_TAKE_PHOTO) {
mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + longitude + "_" + latitude + "_" + timeStamp + ".jpg");
setMediaFile(mediaFile);
} else {
return null;
}
return Uri.fromFile(mediaFile);
}
这里就比较容易理解了,通过intent进行拍照行为命令传递就好,同时需要创建图片文件对应的Uri,名称可以自己定义的。
之后正常的话应该出现你的手机的系统相机界面,同时可以拍照,拍完照就需要调用对应的回调函数进行处理了。
2.照片显示
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Bitmap bm = null;
// 外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口
ContentResolver resolver = getActivity().getContentResolver();
//对于拍照行为的回调
if (requestCode == TAKE_PHOTO_CODE) {
if (resultCode == RESULT_OK) {
if (data != null) {
if (data.hasExtra("data")) {
Log.i("URI", "data is not null");
Bitmap bitmap = data.getParcelableExtra("data");
imagePhoto.setImageBitmap(bitmap);//imageView即为当前页面需要展示照片的控件,可替换
}
} else {
Log.i("URI", "Data is null");
//获得拍照时候的左中右距离,文件名,拍照时间与经纬度坐标
File photoFile = getMediaFile();
String photoName = photoFile.getName();
String photoTime = photoName.split("_")[3].split("\\.")[0];
String photoLongitude = photoName.split("_")[1];
String photoLatitude = photoName.split("_")[2];*/
//将照片显示
Bitmap bitmap = BitmapFactory.decodeFile(getMediaFile().getPath());
imagePhoto.setImageBitmap(ThumbnailUtils.extractThumbnail(bitmap, 250, 200));//imageView即为当前页面需要展示照片的控件,可替换
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}
(不知道为什么在Android6.0里面data拿回来一直是空的,经过测试和网上查找,基本都会跳到else执行)通过读取之前的MediaFile的路径信息拿到图片文件,然后通过缩略处理将照片显示(否则图片太大)
#3.屏幕截图
这里是项目的另一个需求,就是将手机当前的屏幕进行截屏并保存到指定路径。
同样这里需要动态申请权限,权限名为Manifest.permission.WRITE_EXTERNAL_STORAGE,首先判断有没有权限,没有通过requestPermission方法进行申请,这里就不做多描述了。
case R.id.txt_save_image_plane:
try {
saveToSD(myShot(getActivity()), "/storage/emulated/0/Pictures/梅特勒/", "plane-" + getTimeNow() + ".png");
Toast.makeText(getActivity(),"已保存当前信息于-/storage/emulated/0/Pictures/梅特勒/",Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
break;
...
//当前屏幕截图0519
public Bitmap myShot(Activity activity) {
// 获取windows中最顶层的view
View view = activity.getWindow().getDecorView();
view.buildDrawingCache();
// 获取状态栏高度
Rect rect = new Rect();
view.getWindowVisibleDisplayFrame(rect);
int statusBarHeights = rect.top;
Display display = activity.getWindowManager().getDefaultDisplay();
// 获取屏幕宽和高
int widths = display.getWidth();
int heights = display.getHeight();
// 允许当前窗口保存缓存信息
view.setDrawingCacheEnabled(true);
// 去掉状态栏
Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache(), 0,
statusBarHeights, widths, heights - statusBarHeights);
// 销毁缓存信息
view.destroyDrawingCache();
return bmp;
}
//保存到手机SD卡,供分享0519
private void saveToSD(Bitmap bmp, String dirName, String fileName) throws IOException {
// 判断sd卡是否存在
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
File dir = new File(dirName);
// 判断文件夹是否存在,不存在则创建
if (!dir.exists()) {
dir.mkdir();
}
File file = new File(dirName + fileName);
// 判断文件是否存在,不存在则创建
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
if (fos != null) {
// 第一参数是图片格式,第二个是图片质量,第三个是输出流
bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
// 用完关闭
fos.flush();
fos.close();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
首先通过myshot方法获取当前的屏幕截图的bitmap。
然后直接通过saveToSD方法进行bitmap的指定路径保存:先进行文件夹和保存文件名的判断,不存在则创建,然后通过文件输出流的方式把指定的bitmap存入即可,之后便可以在手机指定目录看到当前屏幕的截图文件了