- 浏览: 549814 次
- 性别:
- 来自: 青岛
文章分类
最新评论
-
myworkfirst:
这个mShowing是哪里的定义的? 有没有完整的例子
通过反射重新设置设置Dialog -
mchaoliu:
楼主,这个方法是在哪调用呢?
修改快速滑动滑块的图片为新浪微博滑块样式 -
fxiaozj:
楼主,这个方法是在哪调用呢?
修改快速滑动滑块的图片为新浪微博滑块样式 -
yun2223:
感谢一下,把gen 添加到source 以及检查一下 其他路 ...
gen already exists but is not a source folder -
flyingsir_zw:
解决方法: 1. 右键点击工程,选择 "Proper ...
gen already exists but is not a source folder
从相册或拍照选择照片到EditText
- 博客分类:
- Android
【方法一】使用自定义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中asset文件夹和raw文件夹区别【转】
2013-05-02 08:45 1171res/raw和assets的相同点 ... -
判断android系统的版本和package是否存在【转】
2013-04-27 14:46 27261.判断android系统的版本: publi ... -
startActivityForResult 不满足触发条件就返回的检测
2013-04-25 19:26 2005在android开发中,当不满足触发条件就按返 ... -
EditText 多行显示
2013-04-25 19:15 1720EditText 多行显示: <EditText a ... -
android 数据库导入导出
2013-04-25 15:30 3780方法1.在手机已经获得root权限的前提下(真机如果 ... -
Android使用尺寸资源 dimens
2013-04-25 13:42 6475有时候项目需要修改widget的控件的距离相关属性,只需要 ... -
checkbox 设定文字和选框之间的距离及自定义样式
2013-04-22 17:36 15950改变checkbox默认的文字与选框之间的距离两种方案,刚 ... -
解决 Eclipse 导入安卓项目 No projects are found to import
2013-04-21 10:50 6608在Eclipse里面导入已有的例子的时候,有 ... -
Android开发之Intent.Action
2013-04-19 11:41 0111 -
gen already exists but is not a source folder
2013-04-19 09:21 26468遇到android项目导入出现后重复空包等错误,往往是 ... -
[转]跟 Task 有关的 Intent对象中设置的Flag
2013-04-18 21:38 1214FLAG_ACTIVITY_BROUGHT_TO_FRON ... -
Activity 的Task与Intent FLAG
2013-04-18 21:22 4226Task是包含一系列Activity的堆栈, 遵循先进后出 ... -
[转] Tools之FindBugs
2013-04-14 17:27 8731) 安装 Help->SoftWare Update ... -
项目加入第三方NDK遇到的错误
2013-04-14 14:49 990添加了jar包后,运行程序报 findLibrary ... -
Scrollview中动态添加widget不能滚动的为题
2013-04-14 09:48 4230在Scrollview中使用了动态添加控件,或者Scrol ... -
[转] finally块的问题(finally block does not complete normally)
2013-04-14 09:20 868当finall块中包含return语句时,Eclipse会给 ... -
Use a layout_width of 0dip instead of fill_parent for better performance
2013-04-13 23:45 3149安装了最新的ATD 18之后,新加的Lint Warnin ... -
instanceof
2013-01-29 14:19 919instanceof是Java的一个二元操作符,和==,&g ... -
android 对dp单位的理解
2013-01-08 19:55 2760什么是dp?dp就是dip,d ... -
handler简介
2012-12-15 02:38 0Handler在android里负责发送和处理消息。它的 ...
相关推荐
调取相册或拍照插入到edittext中。
开发环境是用androidstudio,实现了模拟文字语音聊天的功能,以及类似微信相册和拍照的功能, TextView ,EditText 可以显示加载类似微信,QQ一样的表情图片的功能
开发环境Androidstudio,实现了微信聊天的界面,用html实现了Textview ,edittext ,显示表情图片,使用了第三方框架 galleryfinal打开相册,相机
Android调用相册拍照实现系统控件缩放切割图片 Android SQLite的实例汇总大全 两分钟彻底让你明白Android Activity生命周期(图文)! Android 图形系统剖析 Android 立体效果图片 NDK动态库的调用 Android 姿态传感器...
4.1 EditText与TextView共舞 4.2 设计具有背景图的按钮 4.3 给圣诞老人的信息 4.4 我同意条款 4.5 消费券采购列表 4.6 向左或向右 4.7 专业相框设计 4.8 自定义下拉...
4.1 EditText与TextView共舞 4.2 设计具有背景图的按钮 4.3 给圣诞老人的信息 4.4 我同意条款 4.5 消费券采购列表 4.6 向左或向右 4.7 专业相框设计 4.8 自定义下拉菜单模式 4.9 动态添加...
4.1 EditText与TextView共舞 4.2 设计具有背景图的按钮 4.3 给圣诞老人的信息 4.4 我同意条款 4.5 消费券采购列表 4.6 向左或向右 4.7 专业相框设计 4.8 自定义下拉菜单模式 4.9 动态添加/删除的Spinner菜单 4.10 ...
4.1 EditText与TextView共舞 4.2 设计具有背景图的按钮 4.3 给圣诞老人的信息 4.4 我同意条款 4.5 消费券采购列表 4.6 向左或向右 4.7 专业相框设计 4.8 自定义下拉菜单模式 4.9 动态添加/删除的Spinner菜单 4.10 ...
4.1 EditText与TextView共舞 4.2 设计具有背景图的按钮 4.3 给圣诞老人的信息 4.4 我同意条款 4.5 消费券采购列表 4.6 向左或向右 4.7 专业相框设计 4.8 自定义下拉菜单模式 4.9 动态添加/删除的Spinner菜单 4.10 ...
4.1 EditText与TextView共舞 4.2 设计具有背景图的按钮 4.3 给圣诞老人的信息 4.4 我同意条款 4.5 消费券采购列表 4.6 向左或向右 4.7 专业相框设计 4.8 自定义下拉菜单模式 4.9 动态添加/删除的Spinner菜单 4.10 ...
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 自定义下拉菜单...
4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——ImageView的堆栈应用 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与...
4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——ImageView的堆栈应用 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与...
4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——ImageView的堆栈应用 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与...
4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——ImageView的堆栈应用 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与...
——具选择功能的对话框 3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给...
4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——ImageView的堆栈应用 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与...