【问题标题】:Request Image file size请求图像文件大小
【发布时间】:2021-09-15 03:17:39
【问题描述】:

我遵循了一些关于打开画廊和选择图像然后显示图像和文件大小的教程。目前它似乎并没有真正正确地获得文件大小,我不知道这是否是因为权限不正确等等。附上onCreate、openGallery和onActivityResult代码。

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    askPermission();
    imgOriginal = findViewById(R.id.imgOriginal);
    imgCompressed = findViewById(R.id.imgCompressed);
    txtOriginal = findViewById(R.id.txtOriginal);
    txtCompressed = findViewById(R.id.txtCompressed);
    txtQuality = findViewById(R.id.txtQuality);
    txtHeight = findViewById(R.id.txtHeight);
    txtWidth = findViewById(R.id.txtWidth);
    seekBar = findViewById(R.id.seekQuality);
    btnPick = findViewById(R.id.btnPick);
    btnCompress = findViewById(R.id.btnCompress);

    filepath = path.getAbsolutePath();

    if (!path.exists()) {
        path.mkdirs();
    }

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            txtQuality.setText("Quality: " + i);
            seekBar.setMax(100);

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    btnPick.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            openGallery();

        }

    });
    btnCompress.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int quality = seekBar.getProgress();
            int width = Integer.parseInt(txtWidth.getText().toString());
            //int height = Integer.parseInt(txtHeight.getText().toString());
            int height = Integer.parseInt(txtHeight.getText().toString());
            Toast.makeText(MainActivity.this, "Quality " + quality, Toast.LENGTH_SHORT).show();
            try {


                compressedImage = new Compressor(MainActivity.this)
                        .setMaxWidth(width)
                        .setMaxHeight(height)
                        .setQuality(quality)
                        .setCompressFormat(Bitmap.CompressFormat.JPEG)
                        .setDestinationDirectoryPath(filepath)
                        .compressToFile(originalImage);

                File finalFile = new File(filepath, originalImage.getName());
                Bitmap finalBitmap = BitmapFactory.decodeFile(finalFile.getAbsolutePath());
                imgCompressed.setImageBitmap(finalBitmap);
                txtCompressed.setText("size: " + Formatter.formatShortFileSize(MainActivity.this, finalFile.length()));
                //Toast.makeText(MainActivity.this, filepath + " Something went Wrong", Toast.LENGTH_SHORT).show();


            } catch (IOException e) {
                e.printStackTrace();
                Toast.makeText(MainActivity.this, "Error while Compressing", Toast.LENGTH_SHORT).show();

            }


        }
    });
}

public void openGallery() {

    Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(gallery, RESULT_IMAGE);


    

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        btnCompress.setVisibility(View.VISIBLE);
        final Uri imageUri = data.getData();
        try {
            final InputStream imageStream = getContentResolver().openInputStream(imageUri);
            final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
            imgOriginal.setImageBitmap(selectedImage);

            originalImage = new File(imageUri.getEncodedPath().replace("raw/", ""));
            txtOriginal.setText("Size: " + Formatter.formatShortFileSize(this, originalImage.length()));
            Toast.makeText(MainActivity.this, "Size: " + Formatter.formatShortFileSize(this, originalImage.length()), Toast.LENGTH_LONG).show();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
            Toast.makeText(this, "Something went Wrong", Toast.LENGTH_SHORT).show();

        }

    } else {
        Toast.makeText(this, "No Image Selected", Toast.LENGTH_SHORT).show();

    }
}

这是我的权限代码,这可能是我错的地方...本教程建议使用 Dexter,但任何其他方式或对 dexter 的帮助将不胜感激。

private void askPermission() {
    if (SDK_INT >= Build.VERSION_CODES.R) {
        Dexter.withContext(this)
                .withPermissions(Manifest.permission.MANAGE_EXTERNAL_STORAGE,
                        Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE).withListener(new MultiplePermissionsListener() {


            @Override
            public void onPermissionsChecked(MultiplePermissionsReport multiplePermissionsReport) {

            }

            @Override
            public void onPermissionRationaleShouldBeShown(List<PermissionRequest> list, PermissionToken permissionToken) {
                permissionToken.continuePermissionRequest();

            }
        }).check();

    } else {

        Dexter.withContext(this)
                .withPermissions(Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .withListener(new MultiplePermissionsListener() {
                    @Override
                    public void onPermissionsChecked(MultiplePermissionsReport multiplePermissionsReport) {

                    }

                    @Override
                    public void onPermissionRationaleShouldBeShown(List<PermissionRequest> list, PermissionToken permissionToken) {
                        permissionToken.continuePermissionRequest();
                    }
                }).check();
    }
}

}

【问题讨论】:

  • Intent(Intent.ACTION_PICK 如果您让用户选择具有该意图的文件,则不需要任何权限。

标签: java android file


【解决方案1】:
 if (result.getResultCode() == Activity.RESULT_OK ) {
                        // There are no request codes
                        Intent data = result.getData();
                        Uri selectedImage = data.getData();

                        if (isFileLessThan2MB(selectedImage)  <=    2000000){ // 2mp = 2000000
                            Glide.with(getContext()).load(selectedImage).into(binding.addressuploadImg);
                           addressuri =selectedImage;
                        }else {
                            Toast.makeText(getContext(), "File Size Should below 2mp", Toast.LENGTH_SHORT).show();
                        }
                    }



 private long isFileLessThan2MB(Uri file) {
        Cursor returnCursor =
                getActivity().getContentResolver().query(file, null, null, null, null);
        /*
         * Get the column indexes of the data in the Cursor,
         * move to the first row in the Cursor, get the data,
         * and display it.
         */
        int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
        int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
        returnCursor.moveToFirst();
//
//        nameView.setText(returnCursor.getString(nameIndex));
//        sizeView.setText(Long.toString(returnCursor.getLong(sizeIndex)));
        return returnCursor.getLong(sizeIndex);

    }

【讨论】:

    【解决方案2】:

    获取 Uri 文件大小的正确方法:

    long size = DocumentFile.fromSingleUri(context,uri).length();
    

    【讨论】:

    • 我将如何在代码中正确实现这一点?显示 itas txtOriginal?抱歉,我是 Java 新手
    • 将代码中的 originalImage.length() 替换为大小。删除 originalImage= 行并添加上面的代码。
    • 您还需要在我的代码中将 uri 更改为 imageUri 并将上下文更改为 this。
    • 它现在崩溃了,我得到了这个错误 java.lang.RuntimeException: 传递结果失败 ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content:// media/external/images/media/151738 flg=0x1(有附加功能)}} 到活动 {com.example.photocompressor/com.example.photocompressor.MainActivity}:java.lang.NullPointerException:文件
    • 跟踪将包含文件名和发生位置的行号。检查代码中的该位置是否有错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多