在我的应用程序中,我提示用户捕获图像。用户相机活动从buttonClick开始,用户可以选择使用相机捕获图像。
此图像保存在用户手机上。然后将图像上传到firebase存储,一切正常。使用Samsung Note 8,来自一个用户的反馈是,当以纵向模式捕获图像时,他稍后在应用程序中以横向模式显示它。
我查看了firebase存储,发现图像以LANDSCAPE模式保存在存储中,即使用户以纵向模式捕获了图像。
我想我必须将元数据传递给以纵向模式捕获图像的jpeg文件,以便firebase知道它实际上是纵向模式。
这是捕获图像的代码:
private void takePhoto() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
}
if (photoFile != null) {
imageUri = FileProvider.getUriForFile(this, "com.example.android.fileprovider", photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
}
这是方法CreateImageFile:
public File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyy.MM.dd_HH:mm:ss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
"MAP_NAME");
if (!storageDir.exists()) {
if (!storageDir.mkdir()) {
return null;
}
}
File image = File.createTempFile(
imageFileName,
".jpg",
storageDir
);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = image.getAbsolutePath();
return image;
}
最后是上传用于将图像上传到firebase存储的代码的代码:
private StorageTask mUploadTask;
private void uploadFile() {
final String dateStamp = new SimpleDateFormat("dd MM").format(new Date());
final String timeStamp = new SimpleDateFormat("HH:mm:ss").format(new Date());
if (mImageUri != null) {
StorageReference fileReference = mStorageRef.child(System.currentTimeMillis() + "");
mUploadTask = fileReference.putFile(mImageUri)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mProgressBar.setProgress(0);
}
}, 500);
稍后从firebase存储中显示图像时,我使用picasso库,如下所示:
Picasso.with(mContext)
.load(uploadCurrent.getImageUrl())
.placeholder(R.mipmap.ic_launcher)
.centerCrop()
.fit()
.into(holder.imageView);
有可能在毕加索的帮助下检测旋转吗?
答案 0 :(得分:1)
在使用google example拍照时,我遇到了同样的问题,事情是,在捕捉后,当我用Glide设置imageView的路径时,它的显示方向正确,但是上传后旋转了在Firebase存储中。
所以在onActivityResult
中,我将路径设置为imageView,然后获取Bitmap
从路径开始,旋转它并将其保存回路径,然后将文件上传到Firebase Storage。
private Disposable disposable;
disposable = Completable
.fromAction(this::handleImageOrientation)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::uploadProfilePic);
@Override
public void onDestroy() {
super.onDestroy();
if (disposable != null) {
disposable.dispose();
disposable = null;
}
}
如果您不使用RxRava
new Thread() {
@Override
public void run() {
super.run();
handleImageOrientation();
getActivity().runOnUiThread(() -> uploadProfilePic());
}
}.start();
我正在使用支持库中的android.support.media.ExifInterface
,因此android.media.ExifInterface
的实现在旧版Android中存在一些已知的安全漏洞。
build.gradle
implementation "com.android.support:exifinterface:27.1.1"
handleImageOrientation()
private void handleImageOrientation() {
Bitmap bitmap = BitmapFactory.decodeFile(currentPhotoPath);
Bitmap rotatedBitmap;
try {
ExifInterface ei = new ExifInterface(currentPhotoPath);
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotatedBitmap = Utils.rotateImage(bitmap, 90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotatedBitmap = Utils.rotateImage(bitmap, 180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotatedBitmap = Utils.rotateImage(bitmap, 270);
break;
case ExifInterface.ORIENTATION_NORMAL:
default:
rotatedBitmap = bitmap;
}
if (rotatedBitmap != bitmap) {
FileOutputStream fOut = new FileOutputStream(currentPhotoPath);
rotatedBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
}
bitmap.recycle();
rotatedBitmap.recycle();
} catch (IOException e) {
e.printStackTrace();
}
}
Utils.rotateImage()
public static Bitmap rotateImage(Bitmap source, float angle) {
Matrix matrix = new Matrix();
matrix.postRotate(angle);
return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
}