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

标签: android 选择 图片 | 发表时间:2012-09-27 22:51 | 作者:
出处:http://www.iteye.com

 

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

运行效果图:


 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [android 选择 图片] 推荐:

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

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

Android HttpURLConnection及HttpClient选择

- - Trinea
介绍Android中Http请求方式的选择、区别及几个常用框架对API的选择. Android Http请求API主要分两种:. 第一种是Java的HttpURLConnection,默认带gzip压缩. 第二种Apache的HttpClient,默认不带gzip压缩. 两种方式请求connection都是keep alive,默认User-Agent不同.

android截取屏幕图片

- - BlogJava-首页技术区
                mButton.setText("截屏次数:"+mPrintNum);.         //1.构建Bitmap   .         //2.获取屏幕   .         //3.保存Bitmap    .             //文件   .                 Toast.makeText(this, "截屏文件已保存至SDCard/PrintScreenDemo/ScreenImage/下", Toast.LENGTH_LONG).show();   .

android图片压缩方法

- - CSDN博客移动开发推荐文章
第一:我们先看下质量压缩方法.         image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中  .         while ( baos.toByteArray().length / 1024>100) {  //循环判断如果压缩后图片是否大于100kb,大于继续压缩         .

随机选择收件人——Android 短信门?

- nAODI - 爱范儿 · Beats of Bits
前两周可能很多人都在网上看到一个颇为搞笑的地下恋情曝光事件,无辜的记者和报社就这么莫名地被起诉了. 古人有云:若要人不知,除非己莫为. 这种狗血的事情不仅可能会因为记者随意扫街的镜头,也可能因为你拿在手里的 Android 手机. 根据 ZDNET 博客 Hardware 2.0 消息,Android  的文字短信息系统存在故障:在你发送短信时,它会将你的信息随机发送给错误的接收人.

平板电脑为什么还在选择 Android 2.3?

- Yi - 博客园新闻频道
  虽然说针对平板电脑的 Android3.x已经发布好几个月了,Android4.0都快发布了.但是小编发现,现在很多平板电脑都还在选择 Android2.3系统,而不是最新的 Android3.x系统. 比如说亚马逊最新发布的 Kindle Fire 就是在 Android 2.3 上定制的,前一陈联想发布的乐 Pad A1-7也是 Android2.3的系统,除此之外,国内品牌基本上都是在使用 Android2.3或是2.2,而不是 Android3.x系统.

波音787 Dreamliner娱乐系统将选择Android

- kun - cnBeta.COM
很多机舱里面的娱乐系统都是用的iPad,不过波音公司却选择了其死对头Android,在下一代787 Dreamliner上面提供音乐,视频以及一些具体的航空应用. Mark Larson称所有的 787都将会预装基于Android的服务和触摸屏. 松下公司已经制造了首批787认证的Android触摸屏,从经济舱到头等舱都有.

我选择了 Galaxy S II:多角度对比 Android 和 iOS 5

- hidecloud - 爱范儿 · Beats of Bits
就在前几天大家对着 iPhone 4S 一窝蜂而上的时候,我却静悄悄的购买了一部三星 Galaxy S II. 这部机器于 4 月中旬上市,已经走过了半年的生命周期,配置还算先进,但已不再领先. 同时我也拥有一台 iPhone 4 ,已经升级到最新的 iOS 5系统,欣喜地体验了苹果带来的新特性:通知中心、阅读列表、 Twitter 集成、无线 iTunes 同步……但是,给我的 Galaxy S II 装上电池并开机之后,我发现苹果广告中的“新特性”已经在 Galaxy S II 中得到了很好的诠释,有些方面甚至做得更好.

亚马逊应用商店 – Android 手机的新选择

- - 小众软件
Android 应用商店,@scavin 一直非常谨慎的对待,除去. Google Play,至今只用过. 自由的市场配上天朝,让人无法选择、无法信任,那么挑选一款合适的市场,自然是重中之重. 是我心中少有的良心企业,他会因为用户的一句抱怨而给用户退款(亲身体会),虽说退款来自于保险公司(Amazon 会为每笔交易买保险,这是真的),但能真正为 用户利益着想的企业真不多.

html5选择摄像头 android - Enable rear camera with HTML5 - Stack Overflow

- -