`
yxwang0615
  • 浏览: 549814 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

从相册或拍照选择照片到EditText

阅读更多

【方法一】使用自定义AlertDialog

 

private static final int PHOTO_SUCCESS = 1;
private static final int CAMERA_SUCCESS = 2; 
private ImageButton pic; //图片选择按钮

// 从相册或相机选择图片
pic.setOnClickListener(new View.OnClickListener() {

	@Override
	public void onClick(View v) {
		final CharSequence[] items = { "手机相册", "相机拍摄" };
		AlertDialog dlg = new AlertDialog.Builder(NewTopic.this).setTitle("选择图片").setItems(items, 
			new DialogInterface.OnClickListener() { 
				public void onClick(DialogInterface dialog,int item) { 
					//这里item是根据选择的方式,
					//在items数组里面定义了两种方式, 拍照的下标为1所以就调用拍照方法       
					if(item==1){ 
						Intent getImageByCamera= new Intent("android.media.action.IMAGE_CAPTURE");   
						startActivityForResult(getImageByCamera, CAMERA_SUCCESS);   
					}else{ 
						Intent getImage = new Intent(Intent.ACTION_GET_CONTENT); 
						getImage.addCategory(Intent.CATEGORY_OPENABLE); 
						getImage.setType("image/*"); 
						startActivityForResult(getImage, PHOTO_SUCCESS); 
					 } 
				} 
			}).create(); 
		dlg.show(); 
	}
});


protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
	ContentResolver resolver = getContentResolver(); 
	if (resultCode == RESULT_OK) {
		switch (requestCode) {
		case PHOTO_SUCCESS:
			//获得图片的uri 
			Uri originalUri = intent.getData(); 
			Bitmap bitmap = null;
			try {
				Bitmap originalBitmap = BitmapFactory.decodeStream(resolver.openInputStream(originalUri));
				bitmap = resizeImage(originalBitmap, 200, 200);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
			if(bitmap != null){
				//根据Bitmap对象创建ImageSpan对象
				ImageSpan imageSpan = new ImageSpan(NewTopic.this, bitmap);
				//创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像
				SpannableString spannableString = new SpannableString("[local]"+1+"[/local]");
				//  用ImageSpan对象替换face
				spannableString.setSpan(imageSpan, 0, "[local]1[local]".length()+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
				//将选择的图片追加到EditText中光标所在位置
				int index = edit.getSelectionStart(); //获取光标所在位置
				Editable edit_text = edit.getEditableText();
				if(index <0 || index >= edit_text.length()){
					edit_text.append(spannableString);
				}else{
					edit_text.insert(index, spannableString);
				}
			}else{
				Toast.makeText(NewTopic.this, "获取图片失败", Toast.LENGTH_SHORT).show();
			}
			break;
		case CAMERA_SUCCESS:
			Bundle extras = intent.getExtras(); 
			Bitmap originalBitmap1 = (Bitmap) extras.get("data");
			if(originalBitmap1 != null){
				bitmap = resizeImage(originalBitmap1, 200, 200);
				//根据Bitmap对象创建ImageSpan对象
				ImageSpan imageSpan = new ImageSpan(NewTopic.this, bitmap);
				//创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像
				SpannableString spannableString = new SpannableString("[local]"+1+"[/local]");
				//  用ImageSpan对象替换face
				spannableString.setSpan(imageSpan, 0, "[local]1[local]".length()+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
				//将选择的图片追加到EditText中光标所在位置
				int index = edit.getSelectionStart(); //获取光标所在位置
				Editable edit_text = edit.getEditableText();
				if(index <0 || index >= edit_text.length()){
					edit_text.append(spannableString);
				}else{
					edit_text.insert(index, spannableString);
				}
			}else{
				Toast.makeText(NewTopic.this, "获取图片失败", Toast.LENGTH_SHORT).show();
			}
			break;
		default:
			break;
		}
	}
}
/**
 * 图片缩放
 * @param originalBitmap 原始的Bitmap
 * @param newWidth 自定义宽度
 * @param newHeight自定义高度
 * @return 缩放后的Bitmap
 */
private Bitmap resizeImage(Bitmap originalBitmap, int newWidth, int newHeight){
	int width = originalBitmap.getWidth();
	int height = originalBitmap.getHeight();
	//定义欲转换成的宽、高
//		int newWidth = 200;
//		int newHeight = 200;
	//计算宽、高缩放率
	float scanleWidth = (float)newWidth/width;
	float scanleHeight = (float)newHeight/height;
	//创建操作图片用的matrix对象 Matrix
	Matrix matrix = new Matrix();
	// 缩放图片动作
	matrix.postScale(scanleWidth,scanleHeight);
	//旋转图片 动作
	//matrix.postRotate(45);
	// 创建新的图片Bitmap
	Bitmap resizedBitmap = Bitmap.createBitmap(originalBitmap,0,0,width,height,matrix,true);
	return resizedBitmap;
}

alertDialog 的运行效果类似这样:

 

 

【方法二】使用Intent.createChooser

 还可以使用Intent选择器+隐式Intent的方法达到效果,只是这种方式比较繁琐,界面效果也差点。

 首先,定义两个Activity来接受隐式intent, AndroidManifest.xml:

       <activity android:name=".activity.action_get_content.PickPicFromLocalFile" android:label="手机相册">     
            <intent-filter>     
                <action android:name="open_pic_intent" />
                 <category android:name="android.intent.category.DEFAULT" />     
                 <category android:name="android.intent.category.OPENABLE" />     
                 <data android:mimeType="image/*" />     
            </intent-filter>     
        </activity>
        <activity android:name=".activity.action_get_content.PickPicFromCamera" android:label="相机拍摄" android:icon="@drawable/logo1"> 
            <intent-filter>     
                <action android:name="open_pic_intent" />     
                 <category android:name="android.intent.category.DEFAULT" />     
                 <category android:name="android.intent.category.OPENABLE" />     
                 <data android:mimeType="image/*" />     
            </intent-filter>     
        </activity>  
 

 

 PickPicFromLocalFile.java:

 调用了系统的打开本地图库的方法,把intent传给了我们自定义的页面,自定义页面再把Intent传给事件源页面。

 

/**
 * 手机相册 使用Intent.createChooser弹出的菜单
 * @author wangyx
 * @version 1.0.0 2011-12-16
 */

public class PickPicFromLocalFile extends Activity {
	
	protected static final int PICRESULT_LOCAL = 0;
	private Intent intent;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		intent = getIntent();
		Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT);   
		//action_get_content是通过intent中设置的type属性来判断具体调用哪个程序的
		innerIntent.setType("image/*"); 
		startActivityForResult(innerIntent,PICRESULT_LOCAL);
	}
	
	@Override 
	public void onActivityResult(int reqCode, int resultCode, Intent data){
		super.onActivityResult(reqCode, resultCode, data); 
		if(resultCode == RESULT_OK){
			 switch (reqCode) {
		         case (PICRESULT_LOCAL):  
	 	           intent.setData(data.getData());
		           intent.putExtra("flag", 1); //回传用于判断是哪个网页传递的数据
	        	   setResult(RESULT_OK, intent); 
		           finish();
		         break;  
			 }
		} 
	}
}

 PickPicFromCamera.java:调用系统打开相机的方法,照片的数据保存在intent的bundle中,key值为"data"。

 

/**
 * 手机相册 使用Intent.createChooser弹出的菜单
 * @author wangyx
 * @version 1.0.0 2011-12-16
 */

public class PickPicFromCamera extends Activity {
	protected static final int PICRESULT_CAMERA = 0;
	private Intent intent;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		intent = this.getIntent();
		Intent getImageByCamera= new Intent("android.media.action.IMAGE_CAPTURE");   
        startActivityForResult(getImageByCamera, PICRESULT_CAMERA); 
	}
	@Override 
	public void onActivityResult(int reqCode, int resultCode, Intent data){
		super.onActivityResult(reqCode, resultCode, data); 
		if(resultCode == RESULT_OK){
			 switch (reqCode) {
		         case (PICRESULT_CAMERA):  
		        	Bundle extras = data.getExtras(); 
		         	intent.putExtra("flag", 2);
		         	intent.putExtras(extras);
	        	    setResult(RESULT_OK, intent); 
		            finish();
		         break;  
			 }
		} 
	}
}

 处理回传的数据,显示在ImageView上:

 

protected static final int PICRESULT_CODE = 0;
private ImageButton pic; //图片选择按钮
private ImageView iv;

// 从相册或相机选择图片
pic.setOnClickListener(new View.OnClickListener() {
	Intent wrapperIntent = new Intent("open_pic_intent"); 
	wrapperIntent.setType("image/*");  
	startActivityForResult(Intent.createChooser(wrapperIntent, "设置"), PICRESULT_CODE);
}

@Override 
	public void onActivityResult(int reqCode, int resultCode, Intent data){
		 ContentResolver resolver = getContentResolver();
		if(resultCode == RESULT_OK){
			 switch (reqCode) {
			case PICRESULT_CODE:
				Bitmap myBitmap = null;
				if(data.getIntExtra("flag", 0) == 1){
					//处理本地图库返回的数据
					   try { 
				            //获得图片的uri 
				            Uri originalUri = data.getData(); 
				            //将图片内容解析成字节数组 
				            byte[] mContent=readStream(resolver.openInputStream(Uri.parse(originalUri.toString()))); 
				            //将字节数组转换为ImageView可调用的Bitmap对象 
				            myBitmap = getPicFromBytes(mContent, null); 
				        } catch (Exception e) { 
				            System.out.println(e.getMessage()); 
				        } 
				}else if(data.getIntExtra("flag", 0) == 2){
					  try { 
	                        Bundle extras = data.getExtras(); 
	                        myBitmap = (Bitmap) extras.get("data"); 
	                        ByteArrayOutputStream baos = new ByteArrayOutputStream();     
	                        myBitmap.compress(Bitmap.CompressFormat.JPEG , 100, baos);     
					  } catch (Exception e) { 
						  e.printStackTrace(); 
					  } 
				}
			   //把得到的图片绑定在控件上显示 
			   iv.setImageBitmap(myBitmap); 
				break;
			default:
				break;
			}
		}
    } 
	
	public static Bitmap getPicFromBytes(byte[] bytes, BitmapFactory.Options opts) { 
	    if (bytes != null) 
	        if (opts != null) 
	            return BitmapFactory.decodeByteArray(bytes, 0, bytes.length,opts); 
	        else 
	            return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
	    return null; 
	} 

	public static byte[] readStream(InputStream inStream) throws Exception { 
	    byte[] buffer = new byte[1024]; 
	    int len = -1; 
	    ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
	    while ((len = inStream.read(buffer)) != -1) { 
	             outStream.write(buffer, 0, len); 
	    } 
	    byte[] data = outStream.toByteArray(); 
	    outStream.close(); 
	    inStream.close(); 
	    return data; 

	} 
 

    这两个自定义页中中你也可以直接处理图片,在回传的Intent中保存流给接收页面处理,这样做的好处是接受页不必知道是哪个页面回传的数据,少了层逻辑判断,直接将流转为BitMap显示即可,但缺点也很明显:

public Intent putExtra (String name, byte[] value)这个方法传递的字节数不能>40KB,如果超出会报 错。

在数返回显示的逻辑中使用了getPicFromBytes和readStream两个自定义方法,这里只是提供了一种方案,你仍然可以使用方法一中的处理方法。

 

效果图:

选项前的图标是AndroidManifest.xml中相关Activity的icon属性,默认会调用Activity所在项目的icon,目前还没有解决如何不显示选项之前的图标,希望知道的朋友,不吝赐教,留言告知。

分享到:
评论

相关推荐

    Android从相册或拍照选择照片插入到EditText

    调取相册或拍照插入到edittext中。

    微信文字语音聊天相册拍照

    开发环境是用androidstudio,实现了模拟文字语音聊天的功能,以及类似微信相册和拍照的功能, TextView ,EditText 可以显示加载类似微信,QQ一样的表情图片的功能

    聊天,相册,拍照

    开发环境Androidstudio,实现了微信聊天的界面,用html实现了Textview ,edittext ,显示表情图片,使用了第三方框架 galleryfinal打开相册,相机

    android开发资料大全

    Android调用相册拍照实现系统控件缩放切割图片 Android SQLite的实例汇总大全 两分钟彻底让你明白Android Activity生命周期(图文)! Android 图形系统剖析 Android 立体效果图片 NDK动态库的调用 Android 姿态传感器...

    google android sdk开发范例大全 第二版 PDF 光盘代码

     4.1 EditText与TextView共舞   4.2 设计具有背景图的按钮   4.3 给圣诞老人的信息   4.4 我同意条款   4.5 消费券采购列表   4.6 向左或向右   4.7 专业相框设计   4.8 自定义下拉...

    Google Android SDK开发范例大全(第3版)part2

     4.1 EditText与TextView共舞  4.2 设计具有背景图的按钮  4.3 给圣诞老人的信息  4.4 我同意条款  4.5 消费券采购列表  4.6 向左或向右  4.7 专业相框设计  4.8 自定义下拉菜单模式  4.9 动态添加...

    Google Android SDK开发范例大全(第3版) 1/5

    4.1 EditText与TextView共舞 4.2 设计具有背景图的按钮 4.3 给圣诞老人的信息 4.4 我同意条款 4.5 消费券采购列表 4.6 向左或向右 4.7 专业相框设计 4.8 自定义下拉菜单模式 4.9 动态添加/删除的Spinner菜单 4.10 ...

    Google Android SDK开发范例大全(第3版) 4/5

    4.1 EditText与TextView共舞 4.2 设计具有背景图的按钮 4.3 给圣诞老人的信息 4.4 我同意条款 4.5 消费券采购列表 4.6 向左或向右 4.7 专业相框设计 4.8 自定义下拉菜单模式 4.9 动态添加/删除的Spinner菜单 4.10 ...

    Google Android SDK开发范例大全(第3版) 3/5

    4.1 EditText与TextView共舞 4.2 设计具有背景图的按钮 4.3 给圣诞老人的信息 4.4 我同意条款 4.5 消费券采购列表 4.6 向左或向右 4.7 专业相框设计 4.8 自定义下拉菜单模式 4.9 动态添加/删除的Spinner菜单 4.10 ...

    Google Android SDK开发范例大全(第3版) 5/5

    4.1 EditText与TextView共舞 4.2 设计具有背景图的按钮 4.3 给圣诞老人的信息 4.4 我同意条款 4.5 消费券采购列表 4.6 向左或向右 4.7 专业相框设计 4.8 自定义下拉菜单模式 4.9 动态添加/删除的Spinner菜单 4.10 ...

    《Google Android SDK开发范例大全(第3版)》.pdf

    4.1 edittext与textview共舞 85 4.2 设计具有背景图的按钮 86 4.3 给圣诞老人的信息 88 4.4 我同意条款 90 4.5 消费券采购列表 92 4.6 向左或向右 94 4.7 专业相框设计 96 4.8 自定义下拉菜单...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——ImageView的堆栈应用 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——ImageView的堆栈应用 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——ImageView的堆栈应用 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与...

    Google Android SDK开发范例大全的目录

    4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——ImageView的堆栈应用 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与...

    Google+Android+SDK开发范例大全

    ——具选择功能的对话框 3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给...

    Google Android SDK开发范例大全(完整版附部分源码).pdf

    4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——ImageView的堆栈应用 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与...

Global site tag (gtag.js) - Google Analytics