android 选择图片拍照并剪切照片上传到服务器

时间:2022-09-18 22:40:33

界面调用方法: pickerPicture 和 pickerPictureOk 为父类方法,

父类方法中调用上传,界面中只需要处理这两个方法即可;

android 选择图片拍照并剪切照片上传到服务器


父类中处理打开照片,选择完成 和上传到服务器 调用 上传完成通知界面

android 选择图片拍照并剪切照片上传到服务器


android 选择图片拍照并剪切照片上传到服务器

选择图片并剪切,4.4的手机不同于其他

package com.idonoo.shareCar.ui.commom.activitys;

import java.io.File;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;

import com.idonoo.frame.model.ImageStorage;
import com.idonoo.frame.utils.ImageStoreHelper;
import com.idonoo.frame.utils.ImageUtil;
import com.idonoo.shareCar.R;
import com.idonoo.shareCar.app.IntentExtra;
import com.idonoo.shareCar.app.IntentResult;
import com.idonoo.shareCar.uiframe.BaseActivity;
import com.idonoo.shareCar.utils.PhotoUtility;
import com.intbird.soft.utils.BitmapHelper;
import com.intbird.soft.utils.CacheHelper;
import com.intbird.soft.utils.PhoneHelper;

public class TakeImageActivity extends BaseActivity {

private int viewId;
ImageStoreHelper.ImageOptions imageOptions;
private ImageStorage imageFile;

private String orignalFileUrl="";
private String cutedFileUrl="";
private String tempNewFilename="";

private CopyImageTask task;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_popup_take_image);
initUI();
initData();
CacheHelper.initCache("Idonoo");//actually only need once ,but i used when need it;
}

@Override
protected void initUI() {
super.initUI();
super.initActionBar();

setViewClickListener(listener,
R.id.btn_select,
R.id.btn_take_photo,
R.id.cancel);
}

@Override
protected void initData() {
viewId=getIntent().getIntExtra(IntentExtra.EXTRA_IMAGESOTRE_VIEW_ID, 0);
imageFile=(ImageStorage) getIntent().getSerializableExtra(IntentExtra.EXTRA_IMAGESOTRE_STORE_FILE);

orignalFileUrl=imageFile.getFilePath();
imageOptions=imageFile.getOptions();
setSheetView();
}

private void setSheetView() {
int sheetText=getIntent().getIntExtra(IntentExtra.EXTRA_IMAGESOTRE_SHEET_TEXT, 0);

if(sheetText!=0){
TextView tvTip = (TextView) findViewById(R.id.tv_tip_text);
tvTip.setText(getString(sheetText));
tvTip.setVisibility(View.VISIBLE);
}
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("orignalFileUrl", orignalFileUrl);
outState.putString("cutedFileUrl", cutedFileUrl);
outState.putString("tempNewFilename", tempNewFilename);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
orignalFileUrl=savedInstanceState.getString("orignalFileUrl");
cutedFileUrl=savedInstanceState.getString("cutedFileUrl");
tempNewFilename=savedInstanceState.getString("tempNewFilename");
}

View.OnClickListener listener = new View.OnClickListener() {

@Override
public void onClick(View v) {

switch (v.getId()) {
case R.id.btn_select: {
try{
take();
}catch(Exception ex){
showToast("打开手机拍照失败\n请尝试从相册选择~");
}
}
break;
case R.id.btn_take_photo: {
try{
showToast("请从系统图库中选择照片哦~");
select();
}catch(Exception ex){
showToast("从相册选择失败\n请使用其他选图软件哦~");
}
}
break;
case R.id.cancel: {
finish(false);
}
break;
}

}
};

private void take() {
tempNewFilename=imageFile.getFileName()+System.currentTimeMillis()+".jpg";
orignalFileUrl=CacheHelper.createCameraFile(tempNewFilename).getAbsolutePath();
Intent intent = PhotoUtility.gotoCamera(orignalFileUrl);
startActivityForResult(intent, IntentResult.RS_CAMERA);
}

private void select() {
Intent intent = PhotoUtility.gotoGallery();
if(PhoneHelper.isVersionHight(19)){
intent=PhotoUtility.gotoGalleryPick();
}
startActivityForResult(intent, IntentResult.RS_GALLERY);
}

private void crop(){
tempNewFilename=imageFile.getFileName()+System.currentTimeMillis()+".jpg";
cutedFileUrl=CacheHelper.createImageFile(tempNewFilename).getAbsolutePath();
try{
Intent intent = PhotoUtility.cropImageFile(orignalFileUrl,cutedFileUrl,imageOptions.cropWidth,imageOptions.cropHeight);
startActivityForResult(intent, IntentResult.RS_CROP);
}catch(Exception ex){
showToast("手机中缺少图片剪切程序\n将压缩上传原图,请保证图片大小合适");
cutedFileUrl=orignalFileUrl;
task=new CopyImageTask(imageOptions);
task.execute();
}
}

private void cropOk() {
task=new CopyImageTask(imageOptions);
task.execute();
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
switch (requestCode) {
case IntentResult.RS_CAMERA: {
crop();
}
break;
case IntentResult.RS_GALLERY: {
String tempGetUrl="";
try{
tempGetUrl = ImageUtil.getPathFromUri(data.getData());
}catch(Exception ex){
tempGetUrl="";
showToast("貌似选择的图片出了点问题\n请重新选取图片");
}
if(TextUtils.isEmpty(tempGetUrl)){
showToast("貌似选择的图片出了点问题\n请重新选取图片");
return ;
}
orignalFileUrl = tempGetUrl;
crop();
}
break;
case IntentResult.RS_CROP: {
cropOk();
}
break;
}
}
}
private class CopyImageTask extends AsyncTask<Void, Void, File>{
private ImageStoreHelper.ImageOptions options;

public CopyImageTask(ImageStoreHelper.ImageOptions imageOptions){
this.options=imageOptions;
showProgress("正在压缩图片");
}
@Override
protected File doInBackground(Void... params) {
Bitmapcroped = BitmapHelper.getBitmapFromFile(cutedFileUrl, options.cropWidth,options.cropHeight);
//如果经过剪切后的图片大小为空,说明剪切失败了,则尝试获取原图
if(croped==null){
croped = BitmapHelper.getBitmapFromFile(orignalFileUrl, options.cropWidth,options.cropHeight);
}

//如果截取原图失败,将原图地址返回
File newFile;
if(croped==null){
newFile=new File(orignalFileUrl);
return newFile;
}
Bitmap bitmap = BitmapHelper.compressBitmap(croped, options.maxKb);
newFile = CacheHelper.copyBitmapToCache(bitmap,tempNewFilename);

return newFile;
}


@Override
protected void onPostExecute(File file) {
super.onPostExecute(file);
dismissProgress();

if(file==null||!file.exists()){
showToast("复制选中文件到Idonoo文件夹下失败!\n检查图片或内存卡是否可用~");
return ;
}

if(file.length()<10*1024){
file.delete();
showToast("上传图片小于10KB,请重新截取大图~");
return ;
}

imageFile.setFilePath(file.getAbsolutePath());
finish(true);
}
}

private void finish(boolean isOk){
if(!isOk) viewId=0;
Intent intent=new Intent();
intent.putExtra(IntentExtra.EXTRA_IMAGESOTRE_VIEW_ID, viewId);
intent.putExtra(IntentExtra.EXTRA_IMAGESOTRE_STORE_FILE, imageFile);
setResult(Activity.RESULT_OK,intent);

if(task!=null&&!task.isCancelled())
task.cancel(true);

finish();
}
}

package com.idonoo.shareCar.utils;


import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;

import java.io.File;

public class PhotoUtility {

public static Intent gotoGallery() throws NullPointerException{
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null); //ACTION_PICK//ACTION_GET_CONTENT
intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
return intent;
}

public static Intent gotoGalleryPick() throws NullPointerException{
Intent intent = new Intent(Intent.ACTION_PICK, null); //ACTION_PICK//ACTION_GET_CONTENT
intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
return intent;
}

public static Intent gotoCamera(String filePath) throws NullPointerException{
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(filePath)));
return intent;
}

public static Intent cropImage(Uri uri, String filePath, int width, int height) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", width);
intent.putExtra("aspectY", height);
intent.putExtra("outputX", width);
intent.putExtra("outputY", height);
intent.putExtra("return-data", false);
intent.putExtra("noFaceDetection", true);
intent.putExtra("scale", true);
intent.putExtra("scaleUpIfNeeded", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(filePath)));
return intent;
}



public static Intent cropImage(String filePath, int width, int height) {
Uri uri=Uri.fromFile(new File(filePath));
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", width);
intent.putExtra("aspectY", height);
intent.putExtra("outputX", width);
intent.putExtra("outputY", height);
intent.putExtra("return-data", false);
intent.putExtra("noFaceDetection", true);
intent.putExtra("scale", true);
intent.putExtra("scaleUpIfNeeded", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
return intent;
}

public static Intent cropImageFile(String oldPath,String filePath,int width, int height) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(Uri.fromFile(new File(oldPath)), "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", width);
intent.putExtra("aspectY", height);
intent.putExtra("outputX", width);
intent.putExtra("outputY", height);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("return-data", false);
intent.putExtra("noFaceDetection", true);
intent.putExtra("scale", true);
intent.putExtra("scaleUpIfNeeded", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(new File(filePath)));
return intent;
}
}