android 拍照或者图库选择 压缩后 图片 上传

通过拍照或者从相册里选择图片通过压缩并上传时很多应用的常用功能,记录一下实现过程

一:创建个临时文件夹用于保存压缩后需要上传的图片

        /**
	 * path:存放图片目录路径
	 */
	private String path = Environment.getExternalStorageDirectory().getPath() + "/XXX/";
	/**
	 * saveCatalog:保存文件目录
	 */
	private File saveCatalog;

	/**
	 * saveFile:保存的文件
	 */
	private File saveFile;

        public String createOrGetFilePath(String fileName, Context mContext) {
		saveCatalog = new File(path);
		if (!saveCatalog.exists()) {
			saveCatalog.mkdirs();
		}
		saveFile = new File(saveCatalog, fileName);
		try {
			saveFile.createNewFile();
		} catch (IOException e) {
			Toast.makeText(mContext, "创建文件失败,请检查SD是否有足够空间", Toast.LENGTH_SHORT).show();
			e.printStackTrace();
		}
		return saveFile.getAbsolutePath();
	}

二:通过对话框选择获得图片方式(拍照或者相册) <string-array name="get_image_way">

        <item >拍照</item>
        <item >相册</item>
    </string-array>
private String[] image;
image = getResources().getStringArray(R.array.get_image_way);

/**
	 * TODO 通过拍照或者图册获得照片
	 *
	 * @author {author wangxiaohong}
	 */
	private void selectImage() {
		// TODO Auto-generated method stub
		String state = Environment.getExternalStorageState();
		if (!state.equals(Environment.MEDIA_MOUNTED)) {
			Util.showToast(this, getResources().getString(R.string.check_sd)); //检查SD卡是否可用
			return;
		}
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle(R.string.pick_image).setItems(image,
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						if (image[which].equals(getString(R.string.my_data_image_way_photo))) {
							getImageByPhoto();
						} else {
							getImageByGallery();
						}
					}
				});
		builder.create().show();
	}

	private void getImageByGallery() {
	        Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
		intent.setType("image/*");
		startActivityForResult(intent, IMAGE_RESULT);
	}
public String getPath(String carId, String fileName, Context mContext) {
		File saveCatalog = new File(Constant.CACHE, carId);
		// saveCatalog = new File(path);
		if (!saveCatalog.exists()) {
			saveCatalog.mkdirs();
		}
		saveFile = new File(saveCatalog, fileName);
		try {
			saveFile.createNewFile();
		} catch (IOException e) {
			Toast.makeText(mContext, "创建文件失败,请检查SD是否有足够空间", Toast.LENGTH_SHORT).show();
			e.printStackTrace();
		}
		return saveFile.getAbsolutePath();

	}

  

private void getImageByPhoto() {                public static final String CACHE = Environment.getExternalStorageDirectory().getAbsolutePath()+ "/pinchebang/";
		path = util.getPath(user.getCar().getCarId() + "", mPhotoName, PersonalInfoActivity.this);
		imageUri = Uri.fromFile(new File(path));
		Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
		intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
		startActivityForResult(intent, CAMERA_RESULT);
	}

三:在onActivityResult中得到的图片做压缩处理

@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode != Activity.RESULT_OK) return;
		Bitmap bitmap = null;
		if (requestCode == CAMERA_RESULT) {
			bitmap = util.getSmallBitmap(PersonalInfoActivity.this, path);
			boolean flag = util.save(PersonalInfoActivity.this, path, bitmap);
		} else if (requestCode == IMAGE_RESULT) {
			Uri selectedImage = data.getData();
			path = util.getImagePath(PersonalInfoActivity.this, selectedImage);
			bitmap = util.getSmallBitmap(PersonalInfoActivity.this, path);
			String pcbPathString = util.getPath(user.getCar().getCarId() + "", mPhotoName,
					PersonalInfoActivity.this);
			;
			util.save(PersonalInfoActivity.this, pcbPathString, bitmap);
			path = pcbPathString;
		}
		if (null != bitmap) {
			mypicture.setImageBitmap(bitmap);
			HttpUtil.uploadFile(PersonalInfoActivity.this, path, "userImg",
					Constant.URL_VERIFY_DRIVER);
			// MemoryCache memoryCache = new MemoryCache();
			// memoryCache.put(url, bitmap);
		}
	}
上面对应的压缩方法

/**
	 * TODO filePath:图片路径
	 *
	 * @author {author wangxiaohong}
	 */
	public Bitmap getSmallBitmap(Context mContext, String filePath) {
		DisplayMetrics dm;
		dm = new DisplayMetrics();
		((Activity) mContext).getWindowManager().getDefaultDisplay().getMetrics(dm);
		final BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeFile(filePath, options);
		// Calculate inSampleSize
		options.inSampleSize = calculateInSampleSize(options, dm.widthPixels, dm.heightPixels);
		// Decode bitmap with inSampleSize set
		options.inJustDecodeBounds = false;
		return BitmapFactory.decodeFile(filePath, options);
	}

	public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
		// Raw height and width of image
		final int height = options.outHeight;
		final int width = options.outWidth;
		int inSampleSize = 1;
		if (height > reqHeight || width > reqWidth) {

			// Calculate ratios of height and width to requested height and
			// width
			final int heightRatio = Math.round((float) height / (float) reqHeight);
			final int widthRatio = Math.round((float) width / (float) reqWidth);

			// Choose the smallest ratio as inSampleSize value, this will
			// guarantee
			// a final image with both dimensions larger than or equal to the
			// requested height and width.
			inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
		}
		return inSampleSize;
	}

	/**
	 * TODO 保存并压缩图片 将bitmap 保存 到 path 路径的文件里
	 *
	 * @author {author wangxiaohong}
	 */
	public boolean save(Context mContext, String path, Bitmap bitmap) {
		DisplayMetrics dm;
		dm = new DisplayMetrics();
		((Activity) mContext).getWindowManager().getDefaultDisplay().getMetrics(dm);
		if (path != null) {
			try {
				// FileCache fileCache = new FileCache(mContext);
				// File f = fileCache.getFile(url);
				File f = new File(path);
				FileOutputStream fos = new FileOutputStream(f);
				bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos);
				saveMyBitmap(bitmap);
				return true;
			} catch (Exception e) {
				return false;
			}
		} else {
			return false;
		}
	}

	private void saveMyBitmap(Bitmap bm) {
		FileOutputStream fOut = null;
		try {
			fOut = new FileOutputStream(saveFile);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		bm.compress(Bitmap.CompressFormat.JPEG, 70, fOut);
		try {
			fOut.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			fOut.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public String getPath(String carId, String fileName, Context mContext) {
		File saveCatalog = new File(Constant.CACHE, carId);
		// saveCatalog = new File(path);
		if (!saveCatalog.exists()) {
			saveCatalog.mkdirs();
		}
		saveFile = new File(saveCatalog, fileName);
		try {
			saveFile.createNewFile();
		} catch (IOException e) {
			Toast.makeText(mContext, "创建文件失败,请检查SD是否有足够空间", Toast.LENGTH_SHORT).show();
			e.printStackTrace();
		}
		return saveFile.getAbsolutePath();

	}

	/**
	 * TODO 获得相册选择图片的图片路径
	 *
	 * @author {author wangxiaohong}
	 */
	public String getImagePath(Context mContext, Uri contentUri) {
		String[] proj = { MediaStore.Images.Media.DATA };
		Cursor cursor = mContext.getContentResolver().query(contentUri, proj, null, null, null);
		int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
		cursor.moveToFirst();
		String ImagePath = cursor.getString(column_index);
		cursor.close();
		return ImagePath;
	}

四:上传

public static void uploadFile(Context mContext, String path, String modelValue, String url) {
		new PhotoUploadAsyncTask(mContext).execute(path, modelValue, url);
	}

class PhotoUploadAsyncTask extends AsyncTask<String, Integer, String> {
	// private String url = "http://192.168.83.213/receive_file.php";
	private Context context;

	public PhotoUploadAsyncTask(Context context) {
		this.context = context;
	}

	@Override
	protected void onPreExecute() {
	}

	@SuppressWarnings("deprecation")
	@Override
	protected String doInBackground(String... params) {
		// 保存需上传文件信息
		MultipartEntityBuilder entitys = MultipartEntityBuilder.create();
		entitys.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
		entitys.setCharset(Charset.forName(HTTP.UTF_8));
		File file = new File(params[0]);
		entitys.addPart("image", new FileBody(file));
		entitys.addTextBody("model", params[1]);
		HttpEntity httpEntity = entitys.build();
		return HttpUtil.uploadFileWithpost(params[2], context, httpEntity);
	}

	@Override
	protected void onProgressUpdate(Integer... progress) {
	}

	@Override
	protected void onPostExecute(String result) {
		Toast.makeText(context, result, Toast.LENGTH_SHORT).show();
	}

}

/**
	 * 用于文件上传
	 *
	 * @param url
	 * @param mContext
	 * @param entity
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static String uploadFileWithpost(String url, Context mContext, HttpEntity entity) {
		Util.printLog("开始上传");
		try {
			setTimeout();

			httpClient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,
					HttpVersion.HTTP_1_1);
			// 设置连接超时时间
			// httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,
			// 5000);
			HttpPost upPost = new HttpPost(url);
			upPost.setEntity(entity);
			HttpResponse httpResponse = httpClient.execute(upPost, httpContext);
			if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
				return mContext.getString(R.string.upload_success);
			}
		} catch (Exception e) {
			Util.printLog("上传报错");
			e.printStackTrace();
		}
		// finally {
		// if (httpClient != null && httpClient.getConnectionManager() != null)
		// {
		// httpClient.getConnectionManager().shutdown();
		// }
		// }
		Util.printLog("上传成功");
		return mContext.getString(R.string.upload_fail);
	}

  

时间: 2024-10-12 19:13:40

android 拍照或者图库选择 压缩后 图片 上传的相关文章

v9切换ueditor后图片上传路径问题 改成绝对路径

使用V9切换成ueditor编辑器后,图片上传路径显示的是相对路径,同时会把content字段第一张图这个路径同步到缩略图的thumb字段.thumb字段如果是相对路径的话,前端就不能进行裁剪,APP或者其他应用也不能调用. 于是修改. 我用的是1.4.3版本 找到编辑器目录下的/php/Uploader.class.php文件. 找到getFileInfo()方法,修改成如下代码     public function getFileInfo()     { $dangqian_host = 

JavaWeb图片上传的几种方式

一.图片上传介绍 JavaWeb方向编程过程中,实现图片上传有三种方式: 1.传统的基于springMVC的MultipartFile类实现图片上传. 2.基于Ajax的图片上传. 3.基于Base64压缩的图片上传. 二.springMVC图片上传(springboot通用) 此方法的优点是可以将图片和其他的表单元素一起提交到服务器,服务器接受到的图片其实已经存储于容器的临时文件中,进行文件拷贝工作比较简单. 缺点是无法及时看到图片上传的预览效果,图片一旦选择错误只能重新提交. 注:红色代码为

html5图片上传时IOS和Android均显示摄像头拍照和图片选择

最近在做信开发时,发现<input type="file" />在IOS中可以拍照或从照片图库选择,而Android系统则显示资源管理器,无拍照选项,网上查找资料,改为<input type="file" capture="camera">后,Android可显示相机和文档,但IOS则只有拍照选项了,最后通过判断设备类型使在IOS和Android下均可以显示拍照和图库选择,代码如下: var u = navigator.u

Android 从 Android 本地图库选择多个图片

原文地址 本文说明如何从 Android 本地图库选择多个图片.作者考虑很多解决方案. 演示从 Android 本地图库选择多个图片,有两个方法可以实现从图库中选择多个图片: 用 Intent 获取多个图片 自定义图库从本地获取和加载图片 下载 Demo 下载 Demo 后将 QDReader 图片目录复制到 sd 卡上 环境 Windows 2008 R2 64 位 Eclipse ADT V22.6.2,Android 4.4.2(API 19) SAMSUNG GT-8618,Androi

HTML5 Plus 拍照或者相册选择图片上传

利用HTML Plus的Camera.GalleryIO.Storage和Uploader来实现手机APP拍照或者从相册选择图片上传.Camera模块管理设备的摄像头,可用于拍照.摄像操作,通过plus.camera获取摄像头管理对象.Gallery模块管理系统相册,支持从相册中选择图片或视频文件.保存图片或视频文件到相册等功能.通过plus.gallery获取相册管理对象.IO模块管理本地文件系统,用于对文件系统的目录浏览.文件的读取.文件的写入等操作.通过plus.io可获取文件系统管理对象

html + js 实现图片上传,压缩,预览及图片压缩后得到Blob对象继续上传问题

先上效果 上传图片后(设置了最多上传3张图片,三张后上传按钮消失) 点击图片放大,可以使用删除和旋转按钮 (旋转功能主要是因为ios手机拍照后上传会有写图片被自动旋转,通过旋转功能可以调正) html页面 需要引入weui.min.css 不然没法渲染样式, 将下面的代码放在需要上传文件的地方就行了,如果不需要图片旋转功能, 可以直接删掉那个div, 改不改js无影响 addPhoto.html <!--图片缩略图--> <div class="weui-cells weui-

调用相机,选择图片上传,带预览功能、图片压缩、相机文字设置、

摘要 iOS调用相机,iOS调用相册,保存至应用程序沙盒,高保真压缩图片,并有点击放大预览,再次点击缩回至原大小,带动画效果,附源码下载地址. Xcode版本4.5.1 类库ios6.0 IOS调用相机 图片预览 图片上传 压缩图片 模拟器添加图片 目录[-] 判断是否支持相机,跳转到相机或相册界面 七.保存图片 高保真压缩图片方法 八.实现点击图片预览功能,滑动放大缩小,带动画 ps:模拟器添加图片 源码下载地址: 一.新建工程 二.拖控件,创建映射 三.在.h中加入delegate ? 1

H5拍照、选择图片上传组件核心

背景 前段时间项目重构,改成SSR的项目,但之前用的图片选择上传组件不支持SSR(server-side-render).遂进行了调研,发现很多的工具.但有的太大,有的使用麻烦,有的不满足使用需求.决定自己写一个h5移动端图片上传组件.图片上传是一个比较普遍的需求,PC端还好,移动端就不是特别好做了.下面将过程中一些重点的问题进行简单的记录. 重点 1.关于input 选择功能使用<input>标签实现.属性accept='image/*',:capture表示,可以捕获到系统默认的设备,比如

移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传

现在科技太发达,移动设备像素越来越高,随便一张照片2M+,但是要做移动端图片上传和pc上略有不同,移动端你不能去限制图片大小,让用户先处理图片再上传,这样不现实.所以理解的解决方案就是在上传先进行图片压缩,然后再把压缩后的图片上传到服务器. 一翻google之后,发现了localResizeIMG,它会对图片进行压缩成你指定宽度及质量度并转换成base64图片格式,那么我们就可以把这个base64通过ajax传到后台,再进行保存,先压缩后上传的目的就达到了. 处理过程 LocalResizeIM