【发布时间】: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如果您让用户选择具有该意图的文件,则不需要任何权限。