`
104zz
  • 浏览: 1507748 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

android 比较靠谱的选择图片以及拍照,保存图片

阅读更多

 

在开发项目中用到这个功能,之前就按照学过的拍照和选择照片的功能,所以也没在意就写了上去,可是最后发现在有些机子里面获取到的数据时空的,所以会导致程序崩溃的情况出现,网上找了很多例子大多都是一样的,还是有问题,后来就查看跟踪了拍照后返回的数据写了下面的代码相对大多数机子是可行的,经测试还是比较靠谱的,包括拍照后图片翻转了90度问题都没问题。直接看代码:

第一:拍照选择界面:

 

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class SelectPicPopupWindow extends Activity implements OnClickListener {

	private Button btn_take_photo, btn_pick_photo, btn_cancel;
	private LinearLayout layout;
	private Intent intent;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.alert_dialog);
		intent = getIntent();
		btn_take_photo = (Button) this.findViewById(R.id.btn_take_photo);
		btn_pick_photo = (Button) this.findViewById(R.id.btn_pick_photo);
		btn_cancel = (Button) this.findViewById(R.id.btn_cancel);

		layout = (LinearLayout) findViewById(R.id.pop_layout);

		// 添加选择窗口范围监听可以优先获取触点,即不再执行onTouchEvent()函数,点击其他地方时执行onTouchEvent()函数销毁Activity
		layout.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",
						Toast.LENGTH_SHORT).show();
			}
		});
		// 添加按钮监听
		btn_cancel.setOnClickListener(this);
		btn_pick_photo.setOnClickListener(this);
		btn_take_photo.setOnClickListener(this);
	}

	// 实现onTouchEvent触屏函数但点击屏幕时销毁本Activity
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		finish();
		return true;
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (resultCode != RESULT_OK) {
			return;
		}
		//选择完或者拍完照后会在这里处理,然后我们继续使用setResult返回Intent以便可以传递数据和调用
		if (data.getExtras() != null)
			intent.putExtras(data.getExtras());
		if (data.getData()!= null)
			intent.setData(data.getData());
		setResult(1, intent);
		finish();

	}

	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_take_photo:
			try {
				//拍照我们用Action为MediaStore.ACTION_IMAGE_CAPTURE,
				//有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个
				Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
				intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
				startActivityForResult(intent, 1);
			} catch (Exception e) {
				e.printStackTrace();
			}
			break;
		case R.id.btn_pick_photo:
			try {
				//选择照片的时候也一样,我们用Action为Intent.ACTION_GET_CONTENT,
				//有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个
				Intent intent = new Intent();
				intent.setType("image/*");
				intent.setAction(Intent.ACTION_GET_CONTENT);
				startActivityForResult(intent, 2);
			} catch (ActivityNotFoundException e) {

			}
			break;
		case R.id.btn_cancel:
			finish();
			break;
		default:
			break;
		}

	}

}
   

 

第二:显示照片界面:

 

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private ImageView photo;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		photo = (ImageView) this.findViewById(R.id.text);
		// 把文字控件添加监听,点击弹出自定义窗口
		photo.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				//使用startActivityForResult启动SelectPicPopupWindow当返回到此Activity的时候就会调用onActivityResult函数
				startActivityForResult(new Intent(MainActivity.this,
						SelectPicPopupWindow.class), 1);
			}
		});
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {

		switch (resultCode) {
		case 1:
			if (data != null) {
				//取得返回的Uri,基本上选择照片的时候返回的是以Uri形式,但是在拍照中有得机子呢Uri是空的,所以要特别注意
				Uri mImageCaptureUri = data.getData();
				//返回的Uri不为空时,那么图片信息数据都会在Uri中获得。如果为空,那么我们就进行下面的方式获取
				if (mImageCaptureUri != null) {
					Bitmap image;
					try {
						//这个方法是根据Uri获取Bitmap图片的静态方法
						image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), mImageCaptureUri);
						if (image != null) {
							photo.setImageBitmap(image);
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				} else {
					Bundle extras = data.getExtras();
					if (extras != null) {
						//这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片
						Bitmap image = extras.getParcelable("data");
						if (image != null) {
							photo.setImageBitmap(image);
						}
					}
				}

			}
			break;
		default:
			break;

		}
	}

}
 

 

第三:如果需要保存图片到SD卡或者上传图片可以用下面代码:

 

public static String savePicToSdcard(Bitmap bitmap, String path,
			String fileName) {
		String filePath = "";
		if (bitmap == null) {
			return filePath;
		} else {

			filePath=path+ fileName;
			File destFile = new File(filePath);
			OutputStream os = null;
			try {
				os = new FileOutputStream(destFile);
				bitmap.compress(CompressFormat.JPEG, 100, os);
				os.flush();
				os.close();
			} catch (IOException e) {
				filePath = "";
			}
		}
		return filePath;
	}
   

上传图片的话我们可以获取bitmap的流然后上传,如上面方式获取,如要上传,上传代码自己实现,这个比较简单。

运行效果图:


 

  • 大小: 50.9 KB
17
1
分享到:
评论
16 楼 biya2017 2016-02-21  
请问下从相册选择大图的时候报oom异常是如何解决的
15 楼 wangliang68 2015-08-14  
很好用的DEMO
14 楼 xllyll 2015-03-13  
  
13 楼 liunewshine 2015-03-03  
大点的图片,选择后就会不显示
12 楼 lawliet123 2015-01-19  
确实比较靠谱  不过demo里少了个read权限  不然拍的照无法加载到imageview上
11 楼 lovewsb 2014-06-24  
果然靠谱!
10 楼 zzw0221 2014-05-29  
图片大点的话就会OutOfMemoryError
9 楼 jm417113220 2013-12-13  
用楼主这方法果然比用android.media.action.IMAGE_CAPTURE快多了 但是我有点不明白调用系统自带的相机 如果点了保存不是已经存了吗 为什么还要重写savePicToSdcard这个方法了?
8 楼 hu03ping 2013-12-11  
相册选择的 素材还是可以的
7 楼 七岁小猫 2013-11-11  
怒顶楼主 我之前做的apps在自己机器上测试没问题 在别人的手机 或者是老一点的安卓机器上测试 就会出现拍照后确认不显示图片 发出后会报错  我就晕了
  
6 楼 ap0305131Ap 2013-08-22  
感觉好垃圾。
5 楼 mlgb333 2013-07-17  
//这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片 

这里怎么获得图片的路径啊???
4 楼 mlgb333 2013-07-17  
//这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片 
3 楼 wyl5338616 2012-11-09  
如果得不到Uri呢,在你case 1的处理中并没有处理返回信息只得到Bitmap而没有得到Uri,这时你怎么处理的图片旋转问题
2 楼 104zz 2012-09-28  
huangbowen_java 写道
图片翻转90度的问题还是有滴!

OK,在这篇博文中有解答,谢谢指出。http://104zz.iteye.com/blog/1688161
1 楼 huangbowen_java 2012-09-28  
图片翻转90度的问题还是有滴!

相关推荐

    安卓手绘图片处理画板相关-靠谱的图片压缩方法图片压缩.zip

    "靠谱的图片压缩方法图片压缩.zip"这个压缩包可能包含了多种图片压缩算法的实现或者示例代码,虽然无法一一验证其可用性,但可以作为学习和参考的资源。 在安卓系统中,图片压缩主要涉及到以下几个关键知识点: 1....

    Android环境配置(一步到位,绝对的靠谱)

    在Android Studio中选择“Start a new Android Studio project”,然后按照向导选择应用模板,填写项目名称、包名等信息。完成后,Android Studio会自动生成基础项目结构。运行你的应用,如果一切配置无误,你应该能...

    我在CSDN总结的一些比较靠谱的比较靠的NFTS.zip

    我在CSDN总结的一些比较靠谱的比较靠的4个项目希望能帮到大家。

    android简单倒数计时器

    在Android平台上,倒数计时器(CountdownTimer)是一个常用的功能,用于实现从特定时间点开始倒计时至零的计时任务。本项目"android简单倒数计时器"是一个基于Ubuntu 10.04操作系统和Eclipse Galileo IDE的Android...

    靠谱助手微信版

    对于那些需要长时间使用微信或者需要处理大量信息的用户,使用靠谱助手微信版无疑是一种理想的选择。 在安装靠谱助手的过程中,用户需要下载名为"KaoPuWechatSetup-v1.0.0176-Website.exe"的安装文件。这个文件是...

    Android使用Zxing库识别多个二维码

    Android使用Zxing库识别多个二维码

    靠谱助手1.4

    【靠谱助手1.4】是一款深受用户喜爱的电脑模拟器软件,它专为喜欢在电脑上体验手机游戏的用户设计。...无论是为了享受高清大屏的游戏体验,还是为了高效的工作应用,靠谱助手都是一个值得信赖的选择。

    android 模拟器

    这款模拟器的特性包括其易用性、小巧的体积以及对实用性的注重,使得它成为开发人员和普通用户测试应用、玩游戏或进行多任务处理的理想选择。 首先,我们来深入了解Android模拟器的工作原理。Android模拟器基于谷歌...

    数据标注有哪些平台比较靠谱,数据标注有哪些平台可以学习

    数据标注有哪些平台比较靠谱,数据标注有哪些平台可以学习

    面试总结js 靠谱靠谱靠谱.md

    面试总结js 靠谱靠谱靠谱.md

    下载靠谱助手吧

    安卓模拟器社区(靠谱社区)是中国最大的安卓模拟器交流论坛,下载靠谱助手安卓模拟器可在PC电脑上极速运行安卓手游和应用。最全手机游戏电脑版攻略心得!

    推荐求职者-国内比较靠谱的招聘网站.doc

    国内比较靠谱的招聘网站 在找工作的过程中,选择合适的招聘网站是非常重要的。以下是国内比较靠谱的招聘网站的概括信息: 1. 智联招聘 长处:行业规模覆盖面大,整体数据量巨大,可以寻找到多种人才。较合适北方...

    Android自定义可循环的滚动选择器CycleWheelView

    然后,还是自己写一个比较靠谱,用的是ListView实现的。写完自己体验了一下,性能不错,再大的数据也不怕了。 感觉不错,重新封装了一下,提供了一些接口可以直接按照自己的需求定制,调用方法在MainActivity中。 补...

    新版CKEditor实现图片上传,绝对靠谱

    近日要用到CKEditor实现图片上传,网上找了好多代码,要么跑不起来,要么不全,比如不知道如何返回值。跳了不少坑,现在彻底搞定。 目前上传用的是ASP.NET,可以随便切换成PHP、JAVA或其它的语言 只需要把ckeditor...

    怎样构建靠谱团队

    一个靠谱的团队必须有清晰的方向,这包括共同的业务目标、技术追求以及团队文化。团队成员应了解他们的工作是如何对整体目标做出贡献的,这样可以提高团队的凝聚力和执行力。 其次,人员选拔至关重要。在组建团队时...

    靠谱的文件切割工具

    在日常工作中,我们时常会遇到大文件传输或存储的问题,这时就需要借助文件切割工具来解决。...在选择和使用这类工具时,我们需要注意其可靠性、安全性以及易用性,以确保我们的文件处理需求得到满足。

    靠谱助手安卓PC模拟器

    靠谱助手安卓PC模拟器

    Android高仿广告条用ViewPager实现左右完美无限滑动

    如题,网上找了好多都是抄来抄去的,无奈,还是自己写的最靠谱。用ViewPager实现手动切换,用Timer + Handler实现自动切换,左右完美无限滑动效果非常平滑,不卡,哈哈~Fragment里面我是写了文字,大家根据自己的...

    读《马克思靠谱》心得.pdf

    读《马克思靠谱》心得.pdf

    adManager 比较靠谱的版本

    大甩卖了

Global site tag (gtag.js) - Google Analytics