Skip to content
This repository has been archived by the owner on Jan 7, 2023. It is now read-only.

use camera(samsung) in portrait not rotated back #236

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion example/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.soundcloud.android.crop.example" >

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,27 @@

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends Activity {

private ImageView resultView;
public static final int REQUEST_PICK_CAMERA = 91620;

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -24,36 +33,74 @@ protected void onCreate(Bundle savedInstanceState) {
resultView = (ImageView) findViewById(R.id.result_image);
}

//处理6.0动态权限问题
private void requestPermission() {
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
this,
new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_PICK_CAMERA);
} else {
cropFromCamera();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return super.onCreateOptionsMenu(menu);
}

private File imageFile;
private void cropFromCamera(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
String fileName = timeStamp + "_";
File fileDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
try {
imageFile = File.createTempFile(fileName, ".jpg", fileDir);
} catch (IOException e) {
e.printStackTrace();
}

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));
startActivityForResult(intent, REQUEST_PICK_CAMERA);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_select) {
resultView.setImageDrawable(null);
Crop.pickImage(this);
return true;
}else if(item.getItemId() == R.id.action_select2){
resultView.setImageDrawable(null);
requestPermission();
return true;
}
return super.onOptionsItemSelected(item);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent result) {
if (requestCode == Crop.REQUEST_PICK && resultCode == RESULT_OK) {
beginCrop(result.getData());
} else if (requestCode == Crop.REQUEST_CROP) {
if ((requestCode == Crop.REQUEST_PICK || requestCode == REQUEST_PICK_CAMERA) && resultCode == RESULT_OK) {
if(result != null)
beginCrop(result.getData(),4,3);
else {
beginCrop(Uri.fromFile(imageFile),4,3);
}
} else if (requestCode == Crop.REQUEST_CROP || requestCode == REQUEST_PICK_CAMERA) {
handleCrop(resultCode, result);
}
}

private void beginCrop(Uri source) {
private void beginCrop(Uri source,int width,int height) {
Uri destination = Uri.fromFile(new File(getCacheDir(), "cropped"));
Crop.of(source, destination).asSquare().start(this);
Crop.of(source, destination).withAspect(width,height).start(this);
}


private void handleCrop(int resultCode, Intent result) {
if (resultCode == RESULT_OK) {
resultView.setImageURI(Crop.getOutput(result));
Expand Down
4 changes: 4 additions & 0 deletions example/src/main/res/menu/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,8 @@
android:title="@string/action_select"
android:showAsAction="always" />

<item android:id="@+id/action_select2"
android:title="@string/action_select2"
android:showAsAction="always" />

</menu>
3 changes: 2 additions & 1 deletion example/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<resources>

<string name="app_name">Crop Demo</string>
<string name="action_select">Pick</string>
<string name="action_select">PickFromAlumb</string>
<string name="action_select2">PickFromCamera</string>

</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import android.view.Window;
import android.view.WindowManager;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
Expand Down Expand Up @@ -288,6 +289,12 @@ private void onSaveClicked() {
}
}

if(exifRotation != 0 && exifRotation % 90 == 0){
int tmp = outWidth;
outWidth = outHeight;
outHeight = tmp;
}

try {
croppedImage = decodeRegionCrop(r, outWidth, outHeight);
} catch (IllegalArgumentException e) {
Expand Down Expand Up @@ -380,17 +387,27 @@ private void clearImageView() {
private void saveOutput(Bitmap croppedImage) {
if (saveUri != null) {
OutputStream outputStream = null;

Bitmap destBitmap = croppedImage;
if(exifRotation != 0){
destBitmap = CropUtil.rotateImage(croppedImage, exifRotation);
}
FileInputStream inputStream = null;
try {
//save bitmap to file
outputStream = getContentResolver().openOutputStream(saveUri);
if (outputStream != null) {
croppedImage.compress(saveAsPng ? Bitmap.CompressFormat.PNG : Bitmap.CompressFormat.JPEG,
destBitmap.compress(saveAsPng ? Bitmap.CompressFormat.PNG : Bitmap.CompressFormat.JPEG,
90, // note: quality is ignored when using PNG
outputStream);
}
} catch (IOException e) {
destBitmap.recycle();
} catch (OutOfMemoryError error) {
} catch (IOException e){
setResultException(e);
Log.e("Cannot open file: " + saveUri, e);
} finally {
}finally {
CropUtil.closeSilently(inputStream);
CropUtil.closeSilently(outputStream);
}

Expand Down
13 changes: 12 additions & 1 deletion lib/src/main/java/com/soundcloud/android/crop/CropUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Handler;
Expand Down Expand Up @@ -158,7 +160,7 @@ private static File getFromMediaUriPfd(Context context, ContentResolver resolver
}

public static void startBackgroundJob(MonitoredActivity activity,
String title, String message, Runnable job, Handler handler) {
String title, String message, Runnable job, Handler handler) {
// Make the progress dialog uncancelable, so that we can guarantee
// the thread will be done before the activity getting destroyed
ProgressDialog dialog = ProgressDialog.show(
Expand Down Expand Up @@ -215,4 +217,13 @@ public void onActivityStarted(MonitoredActivity activity) {
}
}

public static Bitmap rotateImage(Bitmap img, int rotate) {
Matrix matrix = new Matrix();
matrix.postRotate(rotate);
int width = img.getWidth();
int height = img.getHeight();
img = Bitmap.createBitmap(img, 0, 0, width, height, matrix, false);
return img;
}

}