Java 在android中裁剪图像
我正在使用连续拍摄照片并将其存储在平板电脑上。我需要知道如何裁剪调用takePicture时存储的数据。或者,如果这是不可能的,那么我需要知道如何读取图像,然后使用其他东西来裁剪它。到目前为止,我找到的解决这个问题的唯一方法是打开另一个应用程序进行裁剪。感谢您的帮助 您可以尝试以下代码来裁剪图像: 从下面的代码中,您将得到正确的想法。有时你会得到 如果设备与三星Galaxy S3类似,并且您希望在拍摄后裁剪图像,则会出现问题 在捕获图像后返回空意图。 在这个问题上花了几个小时之后,如果将来有人遇到这个问题,我最终通过下面的方式使它工作Java 在android中裁剪图像,java,android,camera,tablet,Java,Android,Camera,Tablet,我正在使用连续拍摄照片并将其存储在平板电脑上。我需要知道如何裁剪调用takePicture时存储的数据。或者,如果这是不可能的,那么我需要知道如何读取图像,然后使用其他东西来裁剪它。到目前为止,我找到的解决这个问题的唯一方法是打开另一个应用程序进行裁剪。感谢您的帮助 您可以尝试以下代码来裁剪图像: 从下面的代码中,您将得到正确的想法。有时你会得到 如果设备与三星Galaxy S3类似,并且您希望在拍摄后裁剪图像,则会出现问题 在捕获图像后返回空意图。 在这个问题上花了几个小时之后,如果将来有人遇
public class MainActivity extends Activity {
private Uri mImageCaptureUri;
private ImageView mImageView;
private static final int PICK_FROM_CAMERA = 1;
private static final int CROP_FROM_CAMERA = 2;
private static final int PICK_FROM_FILE = 3;
private String selectedImagePath = "";
boolean GallaryPhotoSelected = false;
public static String Finalmedia = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final String[] items = new String[] { "Take from camera",
"Select from gallery" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.select_dialog_item, items);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select Image");
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) { // pick from
// camera
if (item == 0) {
String storageState = Environment.getExternalStorageState();
if (storageState.equals(Environment.MEDIA_MOUNTED)) {
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
// intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
// mImageCaptureUri);
// if (hasImageCaptureBug()) {
String path = Environment.getExternalStorageDirectory()
.getName()
+ File.separatorChar
+ System.currentTimeMillis() + ".jpg";
File file = new File(path);
// mImageCaptureUri = Uri.fromFile(new File(
// Environment.getExternalStorageDirectory(),
// "tmp_avatar_"
// + String.valueOf(System
// .currentTimeMillis())
// + ".jpg"));
Log.i("TAG", "Final path" + path);
try {
if (file.exists() == false) {
file.getParentFile().mkdirs();
file.createNewFile();
}
} catch (IOException e) {
Log.e("TAG", "Could not create file.", e);
}
mImageCaptureUri = Uri.fromFile(file);
intent.putExtra(
android.provider.MediaStore.EXTRA_OUTPUT,
mImageCaptureUri);
// } else {
// intent.putExtra(
// android.provider.MediaStore.EXTRA_OUTPUT,
// android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
// }
try {
// intent.putExtra("return-data", true);
startActivityForResult(intent, PICK_FROM_CAMERA);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
} else {
new AlertDialog.Builder(MainActivity.this)
.setMessage(
"External Storeage (SD Card) is required.\n\nCurrent state: "
+ storageState)
.setCancelable(true).create().show();
}
} else { // pick from file
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Complete action using"), PICK_FROM_FILE);
}
}
});
final AlertDialog dialog = builder.create();
Button button = (Button) findViewById(R.id.btn_crop);
mImageView = (ImageView) findViewById(R.id.iv_photo);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.show();
}
});
}
public boolean hasImageCaptureBug() {
// list of known devices that have the bug
ArrayList<String> devices = new ArrayList<String>();
devices.add("android-devphone1/dream_devphone/dream");
devices.add("generic/sdk/generic");
devices.add("vodafone/vfpioneer/sapphire");
devices.add("tmobile/kila/dream");
devices.add("verizon/voles/sholes");
devices.add("google_ion/google_ion/sapphire");
return devices.contains(android.os.Build.BRAND + "/"
+ android.os.Build.PRODUCT + "/" + android.os.Build.DEVICE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK)
return;
switch (requestCode) {
case PICK_FROM_CAMERA:
Log.i("TAG", "Inside PICK_FROM_CAMERA");
// mImageCaptureUri = data.getData();
// Bitmap bm1 = (Bitmap) data.getExtras().get("data");
// mImageView.setImageBitmap(bm1);
// Bundle extras1 = data.getExtras();
// Bitmap bm1 = (Bitmap) extras1.get("data");
// mImageView.setImageBitmap(bm1);
/*
* try { if (hasImageCaptureBug()) { Log.i("TAG", "Inside Bug");
* selectedImagePath = String.valueOf(System .currentTimeMillis()) +
* ".jpg"; File fi = new File(
* Environment.getExternalStorageDirectory(), selectedImagePath);
* try { mImageCaptureUri = Uri
* .parse(android.provider.MediaStore.Images.Media
* .insertImage(getContentResolver(), fi.getAbsolutePath(), null,
* null)); if (!fi.delete()) { Log.i("logMarker",
* "Failed to delete " + fi); } } catch (FileNotFoundException e) {
* e.printStackTrace(); } } else { mImageCaptureUri =
* data.getData(); } } catch (Exception e) { Log.i("TAG",
* "Inside Bug"); selectedImagePath =
* String.valueOf(System.currentTimeMillis()) + ".jpg"; File fi =
* new File(Environment.getExternalStorageDirectory(),
* selectedImagePath); try { mImageCaptureUri = Uri
* .parse(android.provider.MediaStore.Images.Media
* .insertImage(getContentResolver(), fi.getAbsolutePath(), null,
* null)); if (!fi.delete()) { Log.i("logMarker",
* "Failed to delete " + fi); } } catch (FileNotFoundException e1) {
* e1.printStackTrace(); } }
*/
String path = mImageCaptureUri.getPath();
Log.i("TAG",
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!After capture path "
+ path);
doCrop();
break;
case PICK_FROM_FILE:
mImageCaptureUri = data.getData();
Log.i("TAG",
"After Crop mImageCaptureUri " + mImageCaptureUri.getPath());
GallaryPhotoSelected = true;
doCrop();
break;
case CROP_FROM_CAMERA:
Bundle extras = data.getExtras();
selectedImagePath = mImageCaptureUri.getPath();
Log.i("TAG", "After Crop selectedImagePath " + selectedImagePath);
if (GallaryPhotoSelected) {
selectedImagePath = getRealPathFromURI(mImageCaptureUri);
Log.i("TAG", "Absolute Path " + selectedImagePath);
GallaryPhotoSelected = true;
}
Finalmedia = selectedImagePath;
if (extras != null) {
// Bitmap photo = extras.getParcelable("data");
Log.i("TAG", "Inside Extra " + selectedImagePath);
Bitmap photo = (Bitmap) extras.get("data");
selectedImagePath = String.valueOf(System.currentTimeMillis())
+ ".jpg";
Log.i("TAG", "new selectedImagePath before file "
+ selectedImagePath);
File file = new File(Environment.getExternalStorageDirectory(),
selectedImagePath);
try {
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
photo.compress(Bitmap.CompressFormat.PNG, 95, fos);
} catch (IOException e) {
// TODO Auto-generated catch block
Toast.makeText(this,
"Sorry, Camera Crashed-Please Report as Crash A.",
Toast.LENGTH_LONG).show();
}
selectedImagePath = Environment.getExternalStorageDirectory()
+ "/" + selectedImagePath;
Log.i("TAG", "After File Created " + selectedImagePath);
Bitmap bm = decodeFile(selectedImagePath);
mImageView.setImageBitmap(bm);
}
/*
* File f = new File(mImageCaptureUri.getPath());
*
* if (f.exists()) f.delete();
*/
break;
}
}
public static Bitmap decodeFile(String path) {
int orientation;
try {
if (path == null) {
return null;
}
// decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
// Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 70;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
// while (true) {
// if (width_tmp / 2 < REQUIRED_SIZE
// || height_tmp / 2 < REQUIRED_SIZE)
// break;
// width_tmp /= 2;
// height_tmp /= 2;
// scale++;
// }
// decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
Bitmap bm = BitmapFactory.decodeFile(path, o2);
Bitmap bitmap = bm;
ExifInterface exif = new ExifInterface(path);
orientation = exif
.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
Log.e("ExifInteface .........", "rotation =" + orientation);
// exif.setAttribute(ExifInterface.ORIENTATION_ROTATE_90, 90);
Log.e("orientation", "" + orientation);
Matrix m = new Matrix();
if ((orientation == ExifInterface.ORIENTATION_ROTATE_180)) {
m.postRotate(180);
// m.postScale((float) bm.getWidth(), (float) bm.getHeight());
// if(m.preRotate(90)){
Log.e("in orientation", "" + orientation);
bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
bm.getHeight(), m, true);
return bitmap;
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
m.postRotate(90);
Log.e("in orientation", "" + orientation);
bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
bm.getHeight(), m, true);
return bitmap;
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
m.postRotate(270);
Log.e("in orientation", "" + orientation);
bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
bm.getHeight(), m, true);
return bitmap;
}
return bitmap;
} catch (Exception e) {
return null;
}
}
public String getRealPathFromURI(Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(contentUri, proj, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
private void doCrop() {
final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setType("image/*");
List<ResolveInfo> list = getPackageManager().queryIntentActivities(
intent, 0);
int size = list.size();
if (size == 0) {
Toast.makeText(this, "Can not find image crop app",
Toast.LENGTH_SHORT).show();
return;
} else {
intent.setData(mImageCaptureUri);
intent.setClassName("com.android.camera",
"com.android.camera.CropImage");
intent.putExtra("outputX", 100);
intent.putExtra("outputY", 100);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
intent.putExtra("return-data", true);
// startActivityForResult(intent, CROP_FROM_CAMERA);
if (size == 1) {
Intent i = new Intent(intent);
ResolveInfo res = list.get(0);
i.setComponent(new ComponentName(res.activityInfo.packageName,
res.activityInfo.name));
startActivityForResult(i, CROP_FROM_CAMERA);
} else {
for (ResolveInfo res : list) {
final CropOption co = new CropOption();
co.title = getPackageManager().getApplicationLabel(
res.activityInfo.applicationInfo);
co.icon = getPackageManager().getApplicationIcon(
res.activityInfo.applicationInfo);
co.appIntent = new Intent(intent);
co.appIntent
.setComponent(new ComponentName(
res.activityInfo.packageName,
res.activityInfo.name));
cropOptions.add(co);
}
CropOptionAdapter adapter = new CropOptionAdapter(
getApplicationContext(), cropOptions);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Choose Crop App");
builder.setAdapter(adapter,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
startActivityForResult(
cropOptions.get(item).appIntent,
CROP_FROM_CAMERA);
}
});
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
if (mImageCaptureUri != null) {
getContentResolver().delete(mImageCaptureUri, null,
null);
mImageCaptureUri = null;
}
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
}
}
公共类MainActivity扩展活动{
私有Uri mImageCaptureUri;
私有图像视图mImageView;
私有静态最终整型从摄像机拾取=1;
来自摄像机的专用静态最终整数裁剪=2;
私有静态最终int PICK_FROM_FILE=3;
私有字符串selectedImagePath=“”;
布尔GallaryPhotoSelected=false;
公共静态字符串Finalmedia=“”;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
最终字符串[]项=新字符串[]{“从相机拍摄”,
“从图库中选择”};
ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.select_对话框_项目,项目);
AlertDialog.Builder=新建AlertDialog.Builder(此);
builder.setTitle(“选择图像”);
setAdapter(适配器,新的DialogInterface.OnClickListener(){
public void onClick(DialogInterface对话框,int项){//pick from
//摄像机
如果(项==0){
字符串storageState=Environment.getExternalStorageState();
if(storageState.equals(Environment.MEDIA_MOUNTED)){
意图=新意图(
MediaStore.ACTION_IMAGE_CAPTURE);
//intent.putExtra(android.provider.MediaStore.EXTRA_输出,
//mImageCaptureUri);
//如果(hasImageCaptureBug()){
String path=Environment.getExternalStorageDirectory()
.getName()
+File.separatorChar
+System.currentTimeMillis()+“.jpg”;
文件=新文件(路径);
//mImageCaptureUri=Uri.fromFile(新文件(
//Environment.getExternalStorageDirectory(),
//“tmp_阿凡达”
//+String.valueOf(系统)
//.currentTimeMillis())
//+“.jpg”);
Log.i(“标记”、“最终路径”+路径);
试一试{
if(file.exists()==false){
文件.getParentFile().mkdirs();
createNewFile();
}
}捕获(IOE异常){
Log.e(“标记”,“无法创建文件”,e);
}
mImageCaptureUri=Uri.fromFile(文件);
意向书(
android.provider.MediaStore.EXTRA_输出,
mImageCaptureUri);
//}其他{
//意向书(
//android.provider.MediaStore.EXTRA_输出,
//android.provider.MediaStore.Images.Media.EXTERNAL\u CONTENT\u URI);
// }
试一试{
//intent.putExtra(“返回数据”,true);
startActivityForResult(意图,从摄像机中拾取);
}捕获(ActivityNotFounde异常){
e、 printStackTrace();
}
}否则{
新建AlertDialog.Builder(MainActivity.this)
.setMessage(
“需要外部存储(SD卡)。\n\n当前状态:”
+存储状态)
.setCancelable(true).create().show();
}
}else{//从文件中拾取
意图=新意图();
intent.setType(“image/*”);
intent.setAction(intent.ACTION\u GET\u CONTENT);
startActivityForResult(Intent.createChooser(Intent,
“使用“)完成操作”,从文件中选择);
}
}
});
最终AlertDialog=builder.create();
按钮按钮=(按钮)findViewById(R.id.btn\u裁剪);
mImageView=(ImageView)findViewById(R.id.iv_照片);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
dialog.show();
}
});
}
公共布尔值hasImageCaptureBug(){
//具有该错误的已知设备的列表
ArrayList设备=新的ArrayList();
添加(“android-devphone1/dream_devphone/dream”);
添加(“通用/sdk/generic”);
设备。添加(“沃达丰/vfpioneer/sapphire”);
添加(“tmobile/kila/dream”);
添加(“verizon/voles/sholes”);
添加(“谷歌离子/谷歌离子/蓝宝石”);
返回设备。包含(android.os.Build.BRAND+“/”
public class MainActivity extends Activity {
private Uri mImageCaptureUri;
private ImageView mImageView;
private static final int PICK_FROM_CAMERA = 1;
private static final int CROP_FROM_CAMERA = 2;
private static final int PICK_FROM_FILE = 3;
private String selectedImagePath = "";
boolean GallaryPhotoSelected = false;
public static String Finalmedia = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final String[] items = new String[] { "Take from camera",
"Select from gallery" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.select_dialog_item, items);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select Image");
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) { // pick from
// camera
if (item == 0) {
String storageState = Environment.getExternalStorageState();
if (storageState.equals(Environment.MEDIA_MOUNTED)) {
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
// intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
// mImageCaptureUri);
// if (hasImageCaptureBug()) {
String path = Environment.getExternalStorageDirectory()
.getName()
+ File.separatorChar
+ System.currentTimeMillis() + ".jpg";
File file = new File(path);
// mImageCaptureUri = Uri.fromFile(new File(
// Environment.getExternalStorageDirectory(),
// "tmp_avatar_"
// + String.valueOf(System
// .currentTimeMillis())
// + ".jpg"));
Log.i("TAG", "Final path" + path);
try {
if (file.exists() == false) {
file.getParentFile().mkdirs();
file.createNewFile();
}
} catch (IOException e) {
Log.e("TAG", "Could not create file.", e);
}
mImageCaptureUri = Uri.fromFile(file);
intent.putExtra(
android.provider.MediaStore.EXTRA_OUTPUT,
mImageCaptureUri);
// } else {
// intent.putExtra(
// android.provider.MediaStore.EXTRA_OUTPUT,
// android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
// }
try {
// intent.putExtra("return-data", true);
startActivityForResult(intent, PICK_FROM_CAMERA);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
} else {
new AlertDialog.Builder(MainActivity.this)
.setMessage(
"External Storeage (SD Card) is required.\n\nCurrent state: "
+ storageState)
.setCancelable(true).create().show();
}
} else { // pick from file
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Complete action using"), PICK_FROM_FILE);
}
}
});
final AlertDialog dialog = builder.create();
Button button = (Button) findViewById(R.id.btn_crop);
mImageView = (ImageView) findViewById(R.id.iv_photo);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.show();
}
});
}
public boolean hasImageCaptureBug() {
// list of known devices that have the bug
ArrayList<String> devices = new ArrayList<String>();
devices.add("android-devphone1/dream_devphone/dream");
devices.add("generic/sdk/generic");
devices.add("vodafone/vfpioneer/sapphire");
devices.add("tmobile/kila/dream");
devices.add("verizon/voles/sholes");
devices.add("google_ion/google_ion/sapphire");
return devices.contains(android.os.Build.BRAND + "/"
+ android.os.Build.PRODUCT + "/" + android.os.Build.DEVICE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK)
return;
switch (requestCode) {
case PICK_FROM_CAMERA:
Log.i("TAG", "Inside PICK_FROM_CAMERA");
// mImageCaptureUri = data.getData();
// Bitmap bm1 = (Bitmap) data.getExtras().get("data");
// mImageView.setImageBitmap(bm1);
// Bundle extras1 = data.getExtras();
// Bitmap bm1 = (Bitmap) extras1.get("data");
// mImageView.setImageBitmap(bm1);
/*
* try { if (hasImageCaptureBug()) { Log.i("TAG", "Inside Bug");
* selectedImagePath = String.valueOf(System .currentTimeMillis()) +
* ".jpg"; File fi = new File(
* Environment.getExternalStorageDirectory(), selectedImagePath);
* try { mImageCaptureUri = Uri
* .parse(android.provider.MediaStore.Images.Media
* .insertImage(getContentResolver(), fi.getAbsolutePath(), null,
* null)); if (!fi.delete()) { Log.i("logMarker",
* "Failed to delete " + fi); } } catch (FileNotFoundException e) {
* e.printStackTrace(); } } else { mImageCaptureUri =
* data.getData(); } } catch (Exception e) { Log.i("TAG",
* "Inside Bug"); selectedImagePath =
* String.valueOf(System.currentTimeMillis()) + ".jpg"; File fi =
* new File(Environment.getExternalStorageDirectory(),
* selectedImagePath); try { mImageCaptureUri = Uri
* .parse(android.provider.MediaStore.Images.Media
* .insertImage(getContentResolver(), fi.getAbsolutePath(), null,
* null)); if (!fi.delete()) { Log.i("logMarker",
* "Failed to delete " + fi); } } catch (FileNotFoundException e1) {
* e1.printStackTrace(); } }
*/
String path = mImageCaptureUri.getPath();
Log.i("TAG",
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!After capture path "
+ path);
doCrop();
break;
case PICK_FROM_FILE:
mImageCaptureUri = data.getData();
Log.i("TAG",
"After Crop mImageCaptureUri " + mImageCaptureUri.getPath());
GallaryPhotoSelected = true;
doCrop();
break;
case CROP_FROM_CAMERA:
Bundle extras = data.getExtras();
selectedImagePath = mImageCaptureUri.getPath();
Log.i("TAG", "After Crop selectedImagePath " + selectedImagePath);
if (GallaryPhotoSelected) {
selectedImagePath = getRealPathFromURI(mImageCaptureUri);
Log.i("TAG", "Absolute Path " + selectedImagePath);
GallaryPhotoSelected = true;
}
Finalmedia = selectedImagePath;
if (extras != null) {
// Bitmap photo = extras.getParcelable("data");
Log.i("TAG", "Inside Extra " + selectedImagePath);
Bitmap photo = (Bitmap) extras.get("data");
selectedImagePath = String.valueOf(System.currentTimeMillis())
+ ".jpg";
Log.i("TAG", "new selectedImagePath before file "
+ selectedImagePath);
File file = new File(Environment.getExternalStorageDirectory(),
selectedImagePath);
try {
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
photo.compress(Bitmap.CompressFormat.PNG, 95, fos);
} catch (IOException e) {
// TODO Auto-generated catch block
Toast.makeText(this,
"Sorry, Camera Crashed-Please Report as Crash A.",
Toast.LENGTH_LONG).show();
}
selectedImagePath = Environment.getExternalStorageDirectory()
+ "/" + selectedImagePath;
Log.i("TAG", "After File Created " + selectedImagePath);
Bitmap bm = decodeFile(selectedImagePath);
mImageView.setImageBitmap(bm);
}
/*
* File f = new File(mImageCaptureUri.getPath());
*
* if (f.exists()) f.delete();
*/
break;
}
}
public static Bitmap decodeFile(String path) {
int orientation;
try {
if (path == null) {
return null;
}
// decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
// Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 70;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
// while (true) {
// if (width_tmp / 2 < REQUIRED_SIZE
// || height_tmp / 2 < REQUIRED_SIZE)
// break;
// width_tmp /= 2;
// height_tmp /= 2;
// scale++;
// }
// decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
Bitmap bm = BitmapFactory.decodeFile(path, o2);
Bitmap bitmap = bm;
ExifInterface exif = new ExifInterface(path);
orientation = exif
.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
Log.e("ExifInteface .........", "rotation =" + orientation);
// exif.setAttribute(ExifInterface.ORIENTATION_ROTATE_90, 90);
Log.e("orientation", "" + orientation);
Matrix m = new Matrix();
if ((orientation == ExifInterface.ORIENTATION_ROTATE_180)) {
m.postRotate(180);
// m.postScale((float) bm.getWidth(), (float) bm.getHeight());
// if(m.preRotate(90)){
Log.e("in orientation", "" + orientation);
bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
bm.getHeight(), m, true);
return bitmap;
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
m.postRotate(90);
Log.e("in orientation", "" + orientation);
bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
bm.getHeight(), m, true);
return bitmap;
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
m.postRotate(270);
Log.e("in orientation", "" + orientation);
bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
bm.getHeight(), m, true);
return bitmap;
}
return bitmap;
} catch (Exception e) {
return null;
}
}
public String getRealPathFromURI(Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(contentUri, proj, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
private void doCrop() {
final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setType("image/*");
List<ResolveInfo> list = getPackageManager().queryIntentActivities(
intent, 0);
int size = list.size();
if (size == 0) {
Toast.makeText(this, "Can not find image crop app",
Toast.LENGTH_SHORT).show();
return;
} else {
intent.setData(mImageCaptureUri);
intent.setClassName("com.android.camera",
"com.android.camera.CropImage");
intent.putExtra("outputX", 100);
intent.putExtra("outputY", 100);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
intent.putExtra("return-data", true);
// startActivityForResult(intent, CROP_FROM_CAMERA);
if (size == 1) {
Intent i = new Intent(intent);
ResolveInfo res = list.get(0);
i.setComponent(new ComponentName(res.activityInfo.packageName,
res.activityInfo.name));
startActivityForResult(i, CROP_FROM_CAMERA);
} else {
for (ResolveInfo res : list) {
final CropOption co = new CropOption();
co.title = getPackageManager().getApplicationLabel(
res.activityInfo.applicationInfo);
co.icon = getPackageManager().getApplicationIcon(
res.activityInfo.applicationInfo);
co.appIntent = new Intent(intent);
co.appIntent
.setComponent(new ComponentName(
res.activityInfo.packageName,
res.activityInfo.name));
cropOptions.add(co);
}
CropOptionAdapter adapter = new CropOptionAdapter(
getApplicationContext(), cropOptions);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Choose Crop App");
builder.setAdapter(adapter,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
startActivityForResult(
cropOptions.get(item).appIntent,
CROP_FROM_CAMERA);
}
});
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
if (mImageCaptureUri != null) {
getContentResolver().delete(mImageCaptureUri, null,
null);
mImageCaptureUri = null;
}
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
}
}