`
雨打蕉叶
  • 浏览: 236507 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

android 拍照上传照片

阅读更多


 废话不多说,直接进入主题,想要在android中实现拍照最简单饿方法就是New 一个 Intent 设置Action为android.media.action.IMAGE_CAPTURE 然后使用startActivityForResult(intent,REQUEST_CODE)方法进入相机。当然还有很多方式可以实现,大家可以在网上查找。但是要注意的是在进入相机前最好判断下sdcard是否可用,代码如下:

 

                           destoryBimap();
			String state = Environment.getExternalStorageState();
			if (state.equals(Environment.MEDIA_MOUNTED)) {
				intent = new Intent("android.media.action.IMAGE_CAPTURE");
				startActivityForResult(intent, REQUEST_CODE);
			} else {
				Toast.makeText(DefectManagerActivity.this,
						R.string.common_msg_nosdcard, Toast.LENGTH_LONG).show();
			}

 

 当拍照完成以后需要在onActivityResult(int requestCode, int resultCode, Intent data)方法中获取拍摄的图片,android把拍摄的图片封装到bundle中传递回来,但是根据不同的机器获得相片的方式不太一样,所以会出现某一种方式获取图片为null的想象,解决办法就是做一个判断,当一种方式不能获取,就是用另一种方式,下面是分别获取相片的两种方式:

 

                           Uri uri = data.getData();
			if (uri != null) {
				photo = BitmapFactory.decodeFile(uri.getPath());
			}
			if (photo == null) {
				Bundle bundle = data.getExtras();
				if (bundle != null) {
					photo = (Bitmap) bundle.get("data");
				} else {
					Toast.makeText(DefectManagerActivity.this,
							getString(R.string.common_msg_get_photo_failure),
							Toast.LENGTH_LONG).show();
					return;
				}
			}

 第一种方式是用方法中传回来的intent调用getData();方法获取数据的Uri,然后再根据uri获取数据的路径,然后根据路径封装成一个bitmap就行了.

 

第二种方式也是用法中传回来的intent对象但是不再是调用getData();方法而是调用getExtras();方法获取intent里面所有参数的一个对象集合bundle,然后是用bundle对象得到键为data的值也就是一个bitmap对象.

通过上面两种方式就能获取相片的bitmap对象,然后就可以在程序中是用,如果你想把相片保存到自己指定的目录可以是用如下步骤即可:

首先bitmap有个一compress(Bitmap.CompressFormat.JPEG, 100, baos)方法,这个方法有三个参数,第一个是指定将要保存的图片的格式,第二个是图片保存的质量,值是0-100,比如像PNG格式的图片这个参数你可以随便设置,因为PNG是无损的格式。第三个参数是你一个缓冲输出流ByteArrayOutputStream();,这个方法的作用就是把bitmap的图片转换成jpge的格式放入输出流中,然后大家应该明白怎么操作了吧,下面是实例代码:

 

                  String pictureDir = "";
		FileOutputStream fos = null;
		BufferedOutputStream bos = null;
		ByteArrayOutputStream baos = null;
		try {
			baos = new ByteArrayOutputStream();
			bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
			byte[] byteArray = baos.toByteArray();
			String saveDir = Environment.getExternalStorageDirectory()
					+ "/temple";
			File dir = new File(saveDir);
			if (!dir.exists()) {
				dir.mkdir();
			}
			File file = new File(saveDir, "temp.jpg");
			file.delete();
			if (!file.exists()) {
				file.createNewFile();
			}
			fos = new FileOutputStream(file);
			bos = new BufferedOutputStream(fos);
			bos.write(byteArray);
			pictureDir = file.getPath();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (baos != null) {
				try {
					baos.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (bos != null) {
				try {
					bos.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (fos != null) {
				try {
					fos.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}

 

 然后就是实现图片的上传功能,我这里是是用的apache的HttpClient里面的MultipartEntity实现文件上传具体代码如下:

 

/**
	 * 提交参数里有文件的数据
	 * 
	 * @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()) {
				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();
	}

 

 这里就基本上对图片上传就差不多了,但是还有一个问题就是图片上传完以后bitmap还在内存中,而且大家都知道如果,高清的图片比较大,而手机内存本来就有限,如果不进行处理很容易报内存溢出,所以我们应该把处理完的bitmap从内存中释放掉,这时候就需要调用bitmap的recycle();方法,调用这个方法的时候需要注意不能太早也不能太晚,不然会报异常,一般可以放在下一张图片生成前或者没有任何view引用要销毁的图片的时候下面是实例代码:

 

/**
	 * 销毁图片文件
	 */
	private void destoryBimap() {
		if (photo != null && !photo.isRecycled()) {
			photo.recycle();
			photo = null;
		}
	}
 
分享到:
评论

相关推荐

    android 拍照上传照片(新)源码

    android 拍照上传照片(新)源码,需要的可以下载下去看看。

    android拍照上传代码

    本文将详细解析如何实现这样一个功能,并基于给出的“android拍照上传代码”进行讨论。 首先,Android拍照功能主要依赖于`Intent`系统服务。在Android中,可以启动相机应用来捕获图片,通过创建一个`Intent`对象并...

    android 拍照并上传图片

    通过以上步骤,我们可以实现一个完整的Android应用,它可以调用相机拍照,将图片保存到本地,然后通过HTTPServlet上传到PC端服务器。在实际项目中,还可能需要考虑错误处理、进度显示、多图上传等复杂情况。理解并...

    Android拍照上传图片至服务器

    调用Android系统自带拍照功能对发票进行拍照存储; 使用DES算法加密照片; 基于Socket的上传发票照片及相关信息至服务器并解密;  将发票基本信息存至SqlServer数据库

    android 拍照上传(最新)

    在Android平台上,拍照上传功能是移动应用开发中的常见需求,特别是在社交、分享和记录类的应用中。本教程将深入探讨如何实现这一功能,包括拍照、图片剪切以及上传的详细步骤,非常适合Android开发的新手。 首先,...

    Android图片上传,可以选择多张图片,缩放预览,拍照上传等.rar

    3. **拍照上传**:除了从相册选择图片,用户还应能直接通过相机拍摄新照片上传。我们可以启动相机应用,通过ACTION_IMAGE_CAPTURE Intent捕获用户的拍照结果。拍照完成后,系统会返回一张临时的JPEG图片,我们需要将...

    android摄像头拍照上传到服务器

    在Android平台上,开发一款应用程序允许用户使用内置摄像头拍照并上传照片至PHP服务器是一个常见的需求。这个过程涉及到Android的多媒体API、文件操作以及网络通信技术。下面将详细解释这些知识点。 1. **Android...

    android拍照后将照片上传服务器的例子

    以上就是“android拍照后将照片上传服务器的例子”所涉及的主要技术点,实现这样一个功能需要理解Android的相机API、文件操作、网络请求以及权限管理等多个方面的知识。通过这个例子,开发者可以更好地掌握Android...

    android端拍照上传至服务器端包含服务器代码

    在Android应用开发中,将用户通过手机...以上就是Android端拍照上传至服务器的基本流程和关键知识点,具体实现会根据所选技术和个人风格有所不同。如果你对代码有任何疑问或有改进的想法,可以通过邮件与作者交流。

    Android 拍照上传图片

    在Android平台上,实现拍照上传图片的功能是移动应用开发中常见的需求。这个过程涉及到多个关键步骤,包括请求相机权限、启动相机、处理返回的图像数据、裁剪或压缩图片(如果需要)、以及上传到服务器。以下将详细...

    android 拍照上传源码

    在Android平台上,拍照上传功能是移动应用中常见的需求,它涉及到多媒体处理、网络通信以及用户交互等多个技术领域。本文将详细解析"android 拍照上传源码"中涉及的关键知识点,帮助开发者深入理解这一过程。 一、...

    android 本地上传和拍照上传

    Android拍照上传** 拍照上传是指用户通过应用启动相机拍照后,直接上传照片到服务器。其主要流程如下: - **权限申请**:除了读取外部存储权限,还需要申请相机权限: ```xml &lt;uses-permission android:name=...

    android 拍照上传图片

    综上所述,实现Android拍照上传图片功能需要涵盖权限管理、相机启动、图片捕获、裁剪处理、网络上传等多个技术环节,并注重用户体验和兼容性。每个环节都有其特定的挑战和解决方案,理解并熟练掌握这些知识点是构建...

    Android图片拍照上传Demo.zip

    这个"Android图片拍照上传Demo.zip"很可能是包含了一个完整的示例项目,帮助开发者理解和实现这一功能。现在,我们将深入探讨相关的知识点。 首先,Android提供了多种方式来获取图片,包括: 1. **相机 Intent**:...

    android拍照和上传的例子

    以上就是一个基本的Android拍照和上传图片的实现流程。需要注意的是,由于Android版本的差异,部分API可能需要兼容处理。同时,确保在使用相机和访问外部存储时,获取了相应的权限。在Android 6.0及以上版本,还需要...

    android拍照并上传服务器代码

    总结起来,实现“Android拍照并上传服务器代码”主要涉及以下几个步骤:启动相机、处理返回的图片、数据加密、与服务器的HTTP通信。每个步骤都有相应的Android API和编程技术支持,理解并掌握这些知识点是Android...

    Android 拍照上传和拍照本地显示,拍照剪切上传,选取本地图片剪切上传

    本示例主要讲解如何实现"Android拍照上传和拍照本地显示,拍照剪切上传,选取本地图片剪切上传"的功能,这对于社交、电商、生活类应用尤其关键。下面我们将深入探讨这个主题。 首先,我们来了解Android中的相机API...

    Android拍照上传(含参数)

    以下是一些核心知识点,涵盖了Android拍照上传的完整流程: 1. **请求相机权限**:在Android 6.0(API级别23)及以上版本,应用需要在运行时请求权限,包括`Manifest.permission.CAMERA`和`Manifest.permission....

    android 拍照 录像 本地文件上传客户端 服务端

    在Android应用开发中,涉及到多媒体数据的处理,如拍照、录像和本地文件上传,往往是一项复杂的任务。这个项目集成了拍照、录像以及本地文件上传功能,并提供了客户端和服务端的完整解决方案。下面将详细阐述其中...

    Android-安卓7.0拍照权限适配解决安卓本地图片选择或者拍照更换头像上传后台

    针对标题和描述中提到的问题,我们将详细探讨如何进行Android 7.0的拍照权限适配,以便实现本地图片选择、拍照以及上传头像到后台的功能。 1. **运行时权限介绍** Android 6.0(API级别23)及更高版本中,用户不再...

Global site tag (gtag.js) - Google Analytics