前段时间写过一片关于照片上传的文章,但是后来发现用那种方式上传的图片是经过android系统处理过的,并不是原图,也就是说经过压缩过的,图片会变得很小,今天我就是为了解决这个问题用另外一种方式实现。
首先当我们要得到原有的照片必须为拍照后的照片指定存放的路径地址,这个地址是在Intent中指定,方法是intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
其中file就是手机本地的对应的输出文件,这个需要在传入参数前就生成,不然会报FileNotFoundException,下面是源码:
destoryBimap();
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
String saveDir = Environment.getExternalStorageDirectory()
+ "/temple";
File dir = new File(saveDir);
if (!dir.exists()) {
dir.mkdir();
}
file = new File(saveDir, "temp.jpg");
file.delete();
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(ReportSurveyPointActivity.this,
R.string.photo_file_isnull,
Toast.LENGTH_LONG).show();
return;
}
}
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent, REQUEST_CODE);
} else {
Toast.makeText(ReportSurveyPointActivity.this,
R.string.common_msg_nosdcard, Toast.LENGTH_LONG)
.show();
}
其中destoryBimap()这个方法已经在上一篇文章中介绍过了,是为了把照片从手机内存中清楚调,不然黑容易报内存溢出异常,毕竟原图片比较大。下面就是判断手机是否装载SDCard,接下来在SDCard上生成我们照片保存的地址。
那么接下来就是在onActivityResult()方法中加载我们的照片,这下加载照片就非常简单了,因为在拍照前我们已经给除了照片的路径,我们根据这个路径把照片加载进来就行了,下面是源码:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) {
if (resultCode != RESULT_OK) {
return;
}
if (file != null && file.exists()) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
photo = BitmapFactory.decodeFile(file.getPath(), options);
photo_image.setBackgroundDrawable(new BitmapDrawable(photo));
pictureDir = file.getPath();
} else {
Toast.makeText(this, R.string.photo_file_isnull,
Toast.LENGTH_LONG).show();
}
}
}
这里需要说明一下的就是,当我们要在程序预览照片的时候由于照片比较大,考虑到内存问题,所以我们要把照片进行压缩再放到控件里面,压缩照片的方法就是用BitmapFactory.Options类的inSampleSize这个属性,这个属性的意思说在原照片的大小的多少比例来展示相片,也就是个百分比。我这里是设置的2,也就是说原照片的一般的大小展示。
下面是销毁照片的方法:
/**
* 销毁图片文件
*/
private void destoryBimap() {
if (photo != null && !photo.isRecycled()) {
photo.recycle();
photo = null;
}
}
这个方法我是在每次拍照前和onDestroy()方法中都调用了的,都是处于内存考虑,如果你是dialog的话还建议在dimisslistener中调。
至于大家经常问道的上传照片到后台的方法我也顺便说下,我是用的HttpClient实现的很简单,而后台就是随便什么框架都行,下面是上传照片的方法实现:
/**
* 提交参数里有文件的数据
*
* @param url
* 服务器地址
* @param param
* 参数
* @return 服务器返回结果
* @throws Exception
*/
public static String uploadSubmit(String url, Map<String, String> param,
File file) throws Exception {
HttpPost post = new HttpPost(url);
MultipartEntity entity = new MultipartEntity();
if (param != null && !param.isEmpty()) {
for (Map.Entry<String, String> entry : param.entrySet()) {
if (entry.getValue() != null
&& entry.getValue().trim().length() > 0) {
entity.addPart(entry.getKey(),
new StringBody(entry.getValue()));
}
}
}
// 添加文件参数
if (file != null && file.exists()) {
entity.addPart("file", new FileBody(file));
}
post.setEntity(entity);
HttpResponse response = httpClient.execute(post);
int stateCode = response.getStatusLine().getStatusCode();
StringBuffer sb = new StringBuffer();
if (stateCode == HttpStatus.SC_OK) {
HttpEntity result = response.getEntity();
if (result != null) {
InputStream is = result.getContent();
BufferedReader br = new BufferedReader(
new InputStreamReader(is));
String tempLine;
while ((tempLine = br.readLine()) != null) {
sb.append(tempLine);
}
}
}
post.abort();
return sb.toString();
}
分享到:
相关推荐
android 拍照上传照片(新)源码,需要的可以下载下去看看。
android调用摄像机拍照并通过httpservlet将图片上传至Pc端的服务器,此代码可以改造成上传文件的程序
android拍照后将照片上传至web服务器,服务器端使用servlet+tomcat实现,拍照时实现自动对焦,并且可以调整相机焦距
调用Android系统自带拍照功能对发票进行拍照存储; 使用DES算法加密照片; 基于Socket的上传发票照片及相关信息至服务器并解密; 将发票基本信息存至SqlServer数据库
Android设置拍照或者上传本地图片,很好的例子已经测试过完全可以使用
unity android 照片读取保存 截取 拍照获取手机上的图片
android 拍照特定框内的照片,并载剪保存在本地,可以做成类似微信扫一扫,然后上传框内的照片到服务器,读取照片内容,有不明白的欢迎交流。。
delphi xe6 android 调用照相机摄像头拍照片,简单非常实用的原代码,无特定组件,真机调试没问题.
Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等 - 享受技术带来的快乐! - 博客频道 - CSDN.NET_files
delphi xe5 android 调用照相机摄像头拍照片camera,简单非常实用的原代码,无特定组件!
android 拍照上传源码
调用系统照相机拍照,采用图片框里库预览图片,采用okhttp上传文件至后台。
android仿微信朋友圈上传照片
Android11 适配,拍照问题。兼容Android11 targetSDk 31。有拍照功能和从相册选择图片,获取图片路径,保存图片。关联文章https://blog.csdn.net/u013778491/article/details/125638960
Android选择系统相册或拍照上传源码 类似于社交网站的一个照片上传的功能。简单源码
自己写的android 拍照或从本地相册多次添加多张图片亲测可用
Android, 拍照,选择相册,裁剪,上传照片
安卓7.0拍照权限适配解决安卓本地图片选择或者拍照更换头像上传后台,
Android拍照功能和照片包含参数一起上传服务器,网上很多教程拍照的图片,都是缩略图不是很清晰,所以需要在调用照相机的时候,事先生成一个地址,用于标识拍照的图片URI
Android自定义身份证相机-IDCardCamera 效果图: 功能特点 自定义相机界面 支持开启闪光灯 支持手动触摸屏幕对焦 支持自动对焦 支持图片自动裁剪 支持图片手动不规则裁剪 2 使用 Step 1. 添加JitPack仓库 在...