专业编程基础技术教程

网站首页 > 基础教程 正文

Android拍照存储在Uri中_利用图片后通过Uri获取文件真实路径

ccvgpt 2024-11-08 10:59:15 基础教程 6 ℃

程序中有拍照的需求,拍照的时候,照片存在uri中,然后这个时候,系统会自动保存一遍,拍摄的照片

Android拍照存储在Uri中_利用图片后通过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;
    }

?

Tags:

最近发表
标签列表