Android 11 拍照,裁剪,从相册选择图片遇到的问题

本来之前用一般的开源库,很容易就拍照拿到路径。选择更新太麻烦。我的手机是Android11 ,遇到targetSdk 31的时候,之前的代码就不行了,要改动,现在磨了一个下午,总结了一下,需要的同学直接拿去用吧,死脑细胞的事情就交给我了。

几个注意点要弄下:

1、manifest加入android:requestLegacyExternalStorage="true"

2、provider加入android:exported="false"  android:grantUriPermissions="true"

注意点就这么多,权限啥的我就不说了, 

然后就直接用吧

private void takePhoto() {
        ChoicePhotoDialog choicePhotoDialog = new ChoicePhotoDialog();
        choicePhotoDialog.setSelectedCallBack(integer -> {
            switch (integer) {
                case ChoicePhotoDialog.TAKE_PHOTO://拍照
                    PhotoQUtil.getInstance().takePhoto(this);
                    break;
                case ChoicePhotoDialog.CHOICE_PHOTO://从相册选择
                    PhotoQUtil.getInstance().SelectPicture(this);
                    break;
            }
        });
        choicePhotoDialog.show(getSupportFragmentManager());
    }
@RequiresApi(api = Build.VERSION_CODES.Q)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PhotoQUtil.REQUEST_CAMERA_CAPTURE && resultCode == RESULT_OK) {
            if (!TextUtils.isEmpty(PhotoQUtil.getInstance().currentPhotoPath)) {
                Intent  intent = PhotoQUtil.getInstance().getCropIntent( this);
                startActivityForResult(intent, CROP_CODE);
            }
        } else if (requestCode == CROP_CODE){
            String imagePath = PhotoQUtil.getInstance().parseApiImagePath(this, data);
//            String  imagePath1= PhotoQUtil.getInstance().getFileAbsolutePath(this);
            log("imagePath1   =====xxx " + imagePath);
            Glide.with(instance).load(imagePath).into(iv_pa);
        }else if (requestCode == PhotoQUtil.REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            String imagePath = PhotoQUtil.getInstance().parseApiImagePath(this, data);
            log("imagePath =====" + imagePath);
            if (!TextUtils.isEmpty(imagePath)) {
                iv_pa.setImageBitmap(BitmapFactory.decodeFile(imagePath));
            }
        }
    }
PhotoUtil工具收好,也可以直接去下载Android11适配,拍照问题-Android文档类资源-CSDN下载
package com.lzdr.cyp.li.utils;

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.FileUtils;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.RequiresApi;
import androidx.core.content.FileProvider;

import com.lzdr.cyp.li.config.Constants;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;


public class PhotoUtil {
    private static final String TAG = "cyp";
    private static PhotoUtil mInstance;
    public static final int REQUEST_IMAGE_CAPTURE = 1;//相册选择
    public static final int REQUEST_CAMERA_CAPTURE = 2;//摄像头拍照
    public static final int CROP_CODE = 19;
    public static String currentPhotoPath;
    public Uri photoURI;
    private File photoFile;
    private Uri outPutUri;

//private void takePhoto() {
//        ChoicePhotoDialog choicePhotoDialog = new ChoicePhotoDialog();
//        choicePhotoDialog.setSelectedCallBack(integer -> {
//            switch (integer) {
//                case ChoicePhotoDialog.TAKE_PHOTO://拍照
//                    PhotoQUtil.getInstance().takePhoto(this);
//                    break;
//                case ChoicePhotoDialog.CHOICE_PHOTO://从相册选择
//                    PhotoQUtil.getInstance().SelectPicture(this);
//                    break;
//            }
//        });
//        choicePhotoDialog.show(getSupportFragmentManager());
//    }

    // @RequiresApi(api = Build.VERSION_CODES.Q)
    //    @Override
    //    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //        super.onActivityResult(requestCode, resultCode, data);
    //        if (requestCode == PhotoQUtil.REQUEST_CAMERA_CAPTURE && resultCode == RESULT_OK) {
    //            if (!TextUtils.isEmpty(PhotoQUtil.getInstance().currentPhotoPath)) {
    //                Intent  intent = PhotoQUtil.getInstance().getCropIntent( this);
    //                startActivityForResult(intent, CROP_CODE);
    //            }
    //        } else if (requestCode == CROP_CODE){
    //            String imagePath = PhotoQUtil.getInstance().parseApiImagePath(this, data);
                String  imagePath1= PhotoQUtil.getInstance().getFileAbsolutePath(this);
    //            log("imagePath1   =====xxx " + imagePath);
    //            Glide.with(instance).load(imagePath).into(iv_pa);
    //        }else if (requestCode == PhotoQUtil.REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
    //            String imagePath = PhotoQUtil.getInstance().parseApiImagePath(this, data);
    //            log("imagePath =====" + imagePath);
    //            if (!TextUtils.isEmpty(imagePath)) {
    //                iv_pa.setImageBitmap(BitmapFactory.decodeFile(imagePath));
    //            }
    //        }
    //    }

    public static PhotoUtil getInstance() {
        if (mInstance == null) {
            mInstance = new PhotoUtil();
        }
        return mInstance;
    }

    public Intent getCropIntent(Context context) {
        Log.d("裁剪的Url", "cropRawPhoto: " + photoURI.toString());
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(photoURI, "image/*");
        intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        // 设置裁剪
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", 2000);
        intent.putExtra("outputY", 2000);
        intent.putExtra("return-data", false);
        context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        //android11 分区存储
        if (Build.VERSION.SDK_INT >= 29) {
            File storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
            Log.e("TAG", "裁剪公域::" + storageDir);
            File mOnputFile11 = new File(storageDir, "xx" + ".png");
            try {
                photoFile = createImageFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            outPutUri = Uri.fromFile(photoFile);
            //裁剪后输出路径
            intent.putExtra(MediaStore.EXTRA_OUTPUT, outPutUri);
//            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.parse("file://" + mOnputFile11.getAbsolutePath()));
        } else {
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(
                    new File(context.getExternalCacheDir(), "face-cropped.jpg")));
        }
        return intent;
    }

    /**
     * 通过uri  获取文件路径 只适合Android11及以上
     *
     * @param context 上下文
     * @return 路径
     */
    @RequiresApi(api = Build.VERSION_CODES.Q)
    public String getFileAbsolutePath(Context context) {
        if (context == null) {
            return null;
        }
        return uriToFileApiQ(context, outPutUri);
    }


    /**
     * Android 10 以上适配
     *
     * @param context 上下文
     * @param uri     Uri
     * @return 路径
     */
    private String uriToFileApiQ(Context context, Uri uri) {
        File file = null;
        //android10以上转换
        if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) {
            file = new File(uri.getPath());
        } else if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
            //把文件复制到沙盒目录
            ContentResolver contentResolver = context.getContentResolver();
            @SuppressLint("Recycle")
            Cursor cursor = contentResolver.query(uri, null, null, null, null);
            if (cursor.moveToFirst()) {
                String displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                try {
                    InputStream is = contentResolver.openInputStream(uri);
                    File cache = new File(context.getExternalCacheDir().getAbsolutePath(), Math.round((Math.random() + 1) * 1000) + displayName);
                    FileOutputStream fos = new FileOutputStream(cache);
                    FileUtils.copy(is, fos);
                    file = cache;
                    fos.close();
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return file.getAbsolutePath();
    }

    /**
     * 调用系统裁剪<br>
     *
     * @param sizeX 裁剪x
     * @param sizeY 裁剪y
     */
    public Intent startPhotoZoom(int sizeX, int sizeY) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            //添加这一句表示对目标应用临时授权该Uri所代表的文件
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            //intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        }
        try {
            photoFile = createImageFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        outPutUri = Uri.fromFile(photoFile);
        //裁剪后输出路径
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outPutUri);
        //输入图片路径
        intent.setDataAndType(photoURI, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("circleCrop", "true");
        //华为的手机原型裁剪适应大小
        if (Build.MANUFACTURER.equals("HUAWEI")) {
            intent.putExtra("aspectX", 9998);
            intent.putExtra("aspectY", 9999);
        } else {
            intent.putExtra("aspectX", sizeX);
            intent.putExtra("aspectY", sizeY);
        }
        //输出的图片size越大越清晰,但是过大可能会导致程序崩溃
        intent.putExtra("outputX", sizeX);
        intent.putExtra("outputY", sizeY);
        intent.putExtra("scale", true);
        intent.putExtra("scaleUpIfNeeded", true);
        //设置不返回数据,而是返回JPEG格式,在函数中调用编码函数再显示,这样图片更清晰
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("return-data", false);

        return intent;
    }

    public void takePhoto(Activity activity) {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        try {
            File photoFile = null;
            photoFile = createImageFile();
            if (photoFile != null) {
                photoURI = FileProvider.getUriForFile(activity,
                        Constants.FileProviderValue,
                        photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                activity.startActivityForResult(takePictureIntent, REQUEST_CAMERA_CAPTURE);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public File createImageFile() throws IOException {
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
//        File storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,
                ".jpg",
                storageDir
        );
        currentPhotoPath = image.getAbsolutePath();
        return image;
    }

    /**
     * 选择照片
     */
    public void SelectPicture(Activity activity) {
        Log.i(TAG, "选择照片");
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");
        activity.startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }

    public String parseApiImagePath(Context context, Intent intent) {
        String result = "";
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            result = handleImageOnKitkat(context, intent);
        } else {
            result = handleImageBeforeKitkat(intent);
        }
        Log.i(TAG, "选择照片路径:" + result);
        return result;
    }

    /**
     * 获取大于19版本的图片
     *
     * @param data
     */
    @TargetApi(19)
    private String handleImageOnKitkat(Context context, Intent data) {
        String imagePath = "";
        Uri uri = data.getData();
        if (DocumentsContract.isDocumentUri(context, uri)) {
            String docId = DocumentsContract.getDocumentId(uri);
            if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
                String id = docId.split(":")[1];
                //解析出数字格式的id
                String selection = MediaStore.Images.Media._ID + "=" + id;
                imagePath = getImagePath(context, uri, selection);
            } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
                Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
                imagePath = getImagePath(context, contentUri, null);
            }
        } else if ("content".equalsIgnoreCase(uri.getScheme())) {
            imagePath = getImagePath(context, uri, null);
        } else if ("file".equalsIgnoreCase(uri.getScheme())) {
            imagePath = uri.getPath();
        }
        return imagePath;
    }

    private String handleImageBeforeKitkat(Intent data) {
        String imagePath = "";
        Uri uri = data.getData();
        imagePath = uri.getPath();
        return imagePath;
    }

    @SuppressLint("Range")
    public String getImagePath(Context context, Uri uri, String selection) {
        String path = null;
        /**
         * 通过uri和seletion来获取真实的图片路径
         */
        Cursor cursor = context.getContentResolver().query(uri, null, selection, null, null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            }
            cursor.close();
        }
        return path;
    }

    /*
     * 将照片添加到图库
     * */
    private void galleryAddPic(Context context) {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        if (TextUtils.isEmpty(currentPhotoPath)) {
            File f = new File(currentPhotoPath);
            Uri contentUri = Uri.fromFile(f);
            mediaScanIntent.setData(contentUri);
            context.sendBroadcast(mediaScanIntent);
        }
    }

    /**
     * 保存图片到文件File。
     *
     * @param src     源图片
     * @param file    要保存到的文件
     * @param format  格式
     * @param recycle 是否回收
     * @return true 成功 false 失败
     */
    public static boolean save(Bitmap src, File file, Bitmap.CompressFormat format, boolean recycle) {
        if (src == null)
            return false;

        OutputStream os;
        boolean ret = false;
        try {
            os = new BufferedOutputStream(new FileOutputStream(file));
            ret = src.compress(format, 100, os);
            if (recycle && !src.isRecycled())
                src.recycle();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return ret;
    }

    /**
     * 获取uri 适用Android11,Android10可以使用FileProvider
     *
     * @param context context
     * @param file    文件路径
     * @return
     */
    public static Uri getUriForFile(Context context, File file) {
        Uri fileUri = null;
        String filePath = file.getAbsolutePath();
        Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                new String[]{"_id"}, "_data=? ", new String[]{filePath}, null);
        if (cursor != null && cursor.moveToFirst()) {
            int id = cursor.getInt(cursor.getColumnIndex("_id"));
            Uri baseUri = Uri.parse("content://media/external/images/media");
            fileUri = Uri.withAppendedPath(baseUri, "" + id);
        } else if (file.exists()) {
            ContentValues values = new ContentValues();
            values.put("_data", filePath);
            fileUri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        } else {
            fileUri = null;
        }
        return fileUri;
    }
}

点击去下载文件Android11适配,拍照问题-Android文档类资源-CSDN下载

  • 11
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现拍照裁剪图片功能需要以下步骤: 1. 添加权限 在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` 2. 创建布局文件 创建一个布局文件camera_preview.xml,并添加一个SurfaceView和一个Button,用于显示和拍照。 ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/camera_preview" android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent"/> <Button android:id="@+id/button_capture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="拍照" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true"/> </RelativeLayout> ``` 3. 实现拍照功能 在Activity中,获取Camera实例,并在SurfaceView上显示预览图像。当用户点击拍照按钮时,调用Camera.takePicture()方法拍照拍照成功后,保存照片并显示裁剪界面。 ```java public class CameraActivity extends Activity implements SurfaceHolder.Callback { private Camera mCamera; private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; private Button mButtonCapture; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.camera_preview); // 获取SurfaceView和Button实例 mSurfaceView = findViewById(R.id.surface_view); mButtonCapture = findViewById(R.id.button_capture); // 监听Button点击事件 mButtonCapture.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 拍照 mCamera.takePicture(null, null, mPictureCallback); } }); // 获取SurfaceHolder实例,并添加回调监听 mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { // 打开摄像头并设置预览 mCamera = Camera.open(); try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (IOException e) { Log.d("CameraTest", "Error setting camera preview: " + e.getMessage()); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 在SurfaceView上显示预览图像 if (mSurfaceHolder.getSurface() == null) { return; } try { mCamera.stopPreview(); } catch (Exception e) { Log.d("CameraTest", "Error stopping camera preview: " + e.getMessage()); } try { mCamera.setPreviewDisplay(mSurfaceHolder); mCamera.startPreview(); } catch (Exception e) { Log.d("CameraTest", "Error starting camera preview: " + e.getMessage()); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // 释放摄像头资源 mCamera.stopPreview(); mCamera.release(); mCamera = null; } private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // 保存照片 File pictureFile = getOutputMediaFile(); if (pictureFile == null) { Log.d("CameraTest", "Error creating media file, check storage permissions"); return; } try { FileOutputStream fos = new FileOutputStream(pictureFile); fos.write(data); fos.close(); } catch (FileNotFoundException e) { Log.d("CameraTest", "File not found: " + e.getMessage()); } catch (IOException e) { Log.d("CameraTest", "Error accessing file: " + e.getMessage()); } // 显示裁剪界面 Intent intent = new Intent(CameraActivity.this, CropActivity.class); intent.putExtra("image_path", pictureFile.getPath()); startActivity(intent); } }; private File getOutputMediaFile() { // 创建目录 File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), "MyCameraApp"); if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { Log.d("CameraTest", "failed to create directory"); return null; } } // 创建文件 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); return mediaFile; } } ``` 4. 实现裁剪功能 创建一个布局文件crop.xml,添加一个ImageView和一个Button,用于显示图片和保存裁剪后的图片。 ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/crop_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/image_view" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitCenter"/> <Button android:id="@+id/button_save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true"/> </RelativeLayout> ``` 在CropActivity中,获取传递过来的图片路径,并将图片显示在ImageView上。当用户点击保存按钮时,调用Bitmap.createBitmap()方法裁剪图片,并保存到相册。 ```java public class CropActivity extends Activity { private ImageView mImageView; private Button mButtonSave; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.crop); // 获取ImageView和Button实例 mImageView = findViewById(R.id.image_view); mButtonSave = findViewById(R.id.button_save); // 获取传递过来的图片路径 Intent intent = getIntent(); String imagePath = intent.getStringExtra("image_path"); // 将图片显示在ImageView上 Bitmap bitmap = BitmapFactory.decodeFile(imagePath); mImageView.setImageBitmap(bitmap); // 监听Button点击事件 mButtonSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 裁剪并保存图片 Bitmap croppedBitmap = getCroppedBitmap(bitmap); saveBitmapToGallery(croppedBitmap); Toast.makeText(getApplicationContext(), "保存成功", Toast.LENGTH_SHORT).show(); finish(); } }); } private Bitmap getCroppedBitmap(Bitmap bitmap) { // 获取ImageView的尺寸 int viewWidth = mImageView.getWidth(); int viewHeight = mImageView.getHeight(); // 获取图片的尺寸 int imageWidth = bitmap.getWidth(); int imageHeight = bitmap.getHeight(); // 计算缩放比例 float scale = Math.min((float) viewWidth / imageWidth, (float) viewHeight / imageHeight); // 计算裁剪区域 int cropWidth = (int) (viewWidth / scale); int cropHeight = (int) (viewHeight / scale); int x = (imageWidth - cropWidth) / 2; int y = (imageHeight - cropHeight) / 2; // 裁剪图片 Bitmap croppedBitmap = Bitmap.createBitmap(bitmap, x, y, cropWidth, cropHeight); return croppedBitmap; } private void saveBitmapToGallery(Bitmap bitmap) { // 创建目录 File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), "MyCameraApp"); if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { Log.d("CameraTest", "failed to create directory"); return; } } // 保存图片 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imagePath = mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"; File imageFile = new File(imagePath); try { FileOutputStream fos = new FileOutputStream(imageFile); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (IOException e) { Log.d("CameraTest", "Error accessing file: " + e.getMessage()); } // 通知相册更新 MediaScannerConnection.scanFile(this, new String[]{imagePath}, null, null); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值