网站首页 > 基础教程 正文
程序中有拍照的需求,拍照的时候,照片存在uri中,然后这个时候,系统会自动保存一遍,拍摄的照片
由于利用完照片以后,这个照片,便不再需要了,所以可以删除掉,但删除的时候,我们只有uri,怎么通过
uri来获取,这个文件的真实路径呢?通过文件管理,可以知道这个照片,会被自动存入pictures文件夹中.
openCamera(this); //1.打开摄像头
2.打开摄像头,然后开始拍照
public void openCamera(Activity activity) {
//獲取系統版本
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
// 激活相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 判断存储卡是否可以用,可用进行存储
if (hasSdcard()) {
SimpleDateFormat timeStampFormat = new SimpleDateFormat(
"yyyy_MM_dd_HH_mm_ss");
String filename = timeStampFormat.format(new Date());
String curtimeMillis = System.currentTimeMillis()+".jpg";
Log.e("curtimeMillis:---->>>",curtimeMillis);
tempFile = new File(Environment.getExternalStorageDirectory(),
filename + ".jpg");
if (currentapiVersion < 24) {
// 从文件中创建uri
imageUri = Uri.fromFile(tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//3.注意这里intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//其实就是发起一个存储,把拍摄到的照片自动存储到pictures文件夹中
//1.使用的是SDK,低版本的时候,直接存储
} else {
//2.使用的是SDK是,高版本的时候,使用共享文件的形式存储
//兼容android7.0 使用共享文件的形式
ContentValues contentValues = new ContentValues(1);
contentValues.put(MediaStore.Images.Media.DATA, tempFile.getAbsolutePath());
//检查是否有存储权限,以免崩溃
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
//申请WRITE_EXTERNAL_STORAGE权限
Toast.makeText(this,"请开启存储权限",Toast.LENGTH_SHORT).show();
return;
}
imageUri = activity.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//3.注意这里intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//其实就是发起一个存储,把拍摄到的照片自动存储到pictures文件夹中
}
}
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA
activity.startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
}
3.然后我门再去
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case PHOTO_REQUEST_CAREMA:
if (resultCode == RESULT_OK) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//2021年11月25日19:22:17 不需要启动裁剪程序
//startActivityForResult(intent, CROP_PHOTO); // 启动裁剪程序
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(imageUri));
Matrix matrix = new Matrix();
Integer sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK);
if(sdkVersion.equals(29)){ //android10 的时候用 0.2 压缩到200k左右
matrix.setScale(0.20f, 0.20f);
}else if(sdkVersion.equals(30)){//android11的时候用0.8
matrix.setScale(0.90f, 0.90f);
}else{//其余版本用这个
matrix.setScale(0.80f, 0.80f);
}
Bitmap bitScaleMap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
Log.i("wechat", "压缩后图片的大小" + (bitScaleMap.getByteCount() / 1024 / 1024)
+ "M宽度为" + bitScaleMap.getWidth() + "高度为" + bitScaleMap.getHeight());
tempzmFile = BitmapBaiDuUtils.saveImageReturnAndFile(bitScaleMap,getApplicationContext());
//1.判断有没有生成临时文件生成的话删除,可以看到我们通过imageUri
//获取存储的临时文件,然后删除就可以了.
try{
String filepath = getRealFilePath(this,imageUri);
File file = new File(filepath);
if (file.exists() && file.isFile()){
file.delete();
}
}catch (Exception e){
e.printStackTrace();
}
picture.setImageBitmap(bitScaleMap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
}
}
4.上面通过uri获取文件真实路径的代码:
public static String getRealFilePath( final Context context, final Uri uri ) {
if ( null == uri ) return null;
final String scheme = uri.getScheme();
String data = null;
if ( scheme == null )
data = uri.getPath();
else if ( ContentResolver.SCHEME_FILE.equals( scheme ) ) {
data = uri.getPath();
} else if ( ContentResolver.SCHEME_CONTENT.equals( scheme ) ) {
Cursor cursor = context.getContentResolver().query( uri, new String[] { MediaStore.Images.ImageColumns.DATA }, null, null, null );
if ( null != cursor ) {
if ( cursor.moveToFirst() ) {
int index = cursor.getColumnIndex( MediaStore.Images.ImageColumns.DATA );
if ( index > -1 ) {
data = cursor.getString( index );
}
}
cursor.close();
}
}
return data;
}
?
猜你喜欢
- 2024-11-08 你居然只知道蓝绿发布?今天教你全链路灰度
- 2024-11-08 redis 分布式锁的 5个坑,真是又大又深
- 2024-11-08 Blazor OIDC 单点登录授权实例7 - Blazor hybird app 端授权
- 2024-11-08 Spring Boot利用filter实现xss防御
- 2024-11-08 Spring连环CVE-2015-5211和CVE-2020-5421漏洞升级教程
- 2024-11-08 如何进行权限系统设计,一文吃透 如何设计一个权限系统
- 2024-11-08 基于Spring Boot的注解驱动式公众号极速开发框架FastBootWeixin
- 2024-11-08 教育平台项目前端:项目前后端接口联调,项目上线部署发布
- 2024-11-08 HTTP通讯框架选型HttpClient/OkHttp
- 2024-11-08 微信公众号自动回复功能开发 微信公众号平台自动回复功能
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)