首页 > 其他分享 >android 拍照图片保存方法之二

android 拍照图片保存方法之二

时间:2024-11-24 18:29:11浏览次数:8  
标签:拍照 tempfileuri 之二 Intent new android null yasuo MediaStore

直接利用(Bitmap) extras.get("data")方法获得的图片是系统自动压缩过的缩略图,清晰图不够。

这次介绍的方法是通过uri传递来保存图片。

大概思路如下:

在程序内部创建一个临时文件,利用临时文件的uri传递给响应事件获得原图,并且在一个imageview中显示出来,如果喜欢的话就重新命名保存在公共相册中去。在保存的时候可以提供一定比例压缩一下图片,默认是按30%压缩。

首先在AndroidManifest.xml文件中添加权限并使用FileProvider,选择性地将封装过的Uri共享到外部

<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="com.example.mycamera.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

创建一个资源文件命名为file_paths.xml

<?xml version="1.0" encoding="utf-8"?>


    <paths  xmlns:android="http://schemas.android.com/apk/res/android">
        <external-files-path
            name="my_images"
            path="Pictures" />
    </paths>

然后创建一个获得内部临时文件的uri方法

 private Uri getImageUri() {
  
        String imageFileName = "temp";
        // 获取外部存储的图片目录

        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File imageFile = null;

            imageFile =new File(storageDir +"/"+imageFileName+".jpg");


        // 如果文件创建成功,则返回其URI,否则返回null
        if (imageFile != null) {
            return FileProvider.getUriForFile(this, "com.example.mycamera.fileprovider", imageFile);
        } else {
            return null;
        }


    }

在拍照后通过putExtra(MediaStore.EXTRA_OUTPUT, tempfileuri)

传递图片的uri

   private void takePicture() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            tempfileuri = getImageUri();
            if (tempfileuri != null) {
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempfileuri);
                startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
            } else {
                // 处理URI为null的情况
            }
        }
    }

接着在响应事件中根据uri显示图片

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            // 现在可以使用这个URI,图片已经被保存到这个位置
            //  File file = new File(String.valueOf(tempfileuri));
            try {
                // 使用 ContentResolver 加载图片
                bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), tempfileuri);

                // 将加载的图片显示到 ImageView
                imageView.setImageBitmap(bitmap);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

为拍照按钮和保存按钮绑定响应的方法

  btnCamera.setOnClickListener(v -> {
            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA},
                        REQUEST_CAMERA_PERMISSION);
            }
            takePicture();
        });
   btnSave.setOnClickListener(v -> {
            saveImageToGalleryQ(bitmap);
            bitmap = null;
            imageView.setImageBitmap(bitmap);
            photoname.setText("");
            imageView.invalidate();
        });

保存图片方法如下

public void saveImageToGalleryQ(Bitmap image) {
        String mImageFileName = photoname.getText().toString() + "_" + getDateTime();
       int yasuo=100;
       String editTextNumberstring = editTextNumber.getText().toString();
       if(editTextNumberstring.equals(""))
       {
           yasuo=0;
       }else {
           yasuo=Integer.parseInt(editTextNumberstring);
           if(yasuo<=0){
               yasuo=0;
           }else if(yasuo>=100){
               yasuo=100;
           }
       }

        ContentValues values = new ContentValues();
        values.put(MediaStore.MediaColumns.DISPLAY_NAME, mImageFileName);
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
        ContentResolver contentResolver = getContentResolver();
        try {
            // 将Bitmap保存到相册
            Uri photouri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            if (photouri != null) {
                // 获取输出流
                android.os.ParcelFileDescriptor parcelFileDescriptor = contentResolver.openFileDescriptor(photouri, "w");
                if (parcelFileDescriptor != null) {
                    java.io.FileOutputStream fileOutputStream = new java.io.FileOutputStream(parcelFileDescriptor.getFileDescriptor());
                    image.compress(Bitmap.CompressFormat.JPEG, 100-yasuo, fileOutputStream);
                    fileOutputStream.close();
                    parcelFileDescriptor.close();
                }
                Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                mediaScanIntent.setData(photouri);
                sendBroadcast(mediaScanIntent);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

标签:拍照,tempfileuri,之二,Intent,new,android,null,yasuo,MediaStore
From: https://blog.csdn.net/dongchaotiantian/article/details/143873972

相关文章

  • 一文学习Android系统核心服务ServiceManager
    ServiceManager是Android系统中核心的系统服务注册与发现机制,它在AndroidFramework层扮演服务注册中心的角色。它允许进程通过它注册、查询和使用系统服务,实现进程间通信(IPC)的基础架构。ServiceManager的作用服务注册:应用程序或系统组件可以将一个Binder对象......
  • 自然色调人像自拍照后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
    调色教程自然色调人像自拍照后期通过Lightroom调色,旨在打造出清新、自然、真实的人像效果。这种风格强调还原人物的本来面貌,同时增强照片的色彩和光影表现力,让自拍照更加生动和吸引人。预设信息调色风格:清晰透明风格预设适合类型:人像,街拍,自拍,旅拍,城市,风光等预设格式:XMP+D......
  • Android开发教程实战案例源码分享-BottomNavigationView 使用以及中间凸起效果
    Android开发教程实战案例源码分享-BottomNavigationView使用以及中间凸起效果主页中间往往有凸起效果的需求一、思路:BottomNavigationView,中间用盖一层方式二、效果图:也可以看视频,直观点:Android开发教程实战案例源码分享-BottomNavigationView使用以及中间凸起......
  • Cellebrite UFED 4PC 7.71 发布下载 - Android 和 iOS 移动设备取证软件
    CellebriteUFED4PC7.71(Windows)-Android和iOS移动设备取证软件TheIndustryStandardforLawfullyAccessingandCollectingDigitalData请访问原文链接:https://sysin.org/blog/cellebrite-ufed/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgCellebr......
  • 高通android手机蓝牙重启问题分析
    问题背景这两天芯片厂更新了芯片的固件,然而我们用高通平台手机去配对(其他平台手机没这个问题),发现手机蓝牙会重启,下面就开始debug之路:问题分析先看手机logcatlog手机蓝牙重启自然先看一下手机端的logcatlog,一般这种手机蓝牙重启就说明蓝牙进程发生了crash之类的,导致蓝......
  • Android Studio 中使用switch语句时报错Constant expression required的解决方法
    在工程目录下第一级的gradle.properties中添加:android.nonFinalResIds=false然后SyncNow重新gradle,就不会再报错了。 1. Android项目中,资源文件(如R.string、R.layout等)会在构建时生成对应的R类,包含每个资源的唯一ID。过去,这些资源ID默认是final的。andr......
  • Android 12.0 SystemUI低电量禁止打开手电筒功能实现
    1.前言在12.0的系统rom定制化开发中,在systemui下拉状态栏中可以通过手电筒开关来打开关闭手电筒功能,而在最近的开发中,需要在低电量的情况下禁止打开手电筒,接下来判断打开手电筒之前的当前电量,低电量模式返回就可以了接下来具体实现相关功能2.SystemUI低电量禁止打开手电筒......
  • Android开发教程案例源码分享-匹配动画多个头像飘动效果
    Android开发教程案例源码分享-匹配动画多个头像飘动效果匹配往往出现多个头像飘动,吸引人点击,有时出现的位置还不固定一、思路:用MotionLayout二、效果图:看视频更直观点:Android开发教程案例源码分享-匹配动画多个头像飘动效果三、关键代码:xml布局<?xmlversion......
  • AndroidStudio清除重置Http Proxy代理的方式
    问题背景在国内做代码开发的都知道,在国际互联网我们存在看不见的墙,导致无法访问一些代码库和资源,所以在使用开发工具拉取第三方库的时候总会遇到无法连接或者连接超时的情况,所以就会使用一些安全的网络代理工具,辅助完成我们的环境配置等工作,例如android程序员在使用andro......
  • Android 13.0 系统framework修改低电量关机值为2%
    1.前言在13.0的系统rom产品定制化开发中,在系统关于低电量关机的值,每个平台都不同,根据实际开发底层硬件的要求看实际情况来调整这个值,所以需要分析相关的电量变化执行的代码流程,来实现这个功能,接下来看具体怎么实现2.系统framework修改低电量关机值为2%的核心类frameworks\b......