• android拍摄照片和从相册选择照片


    界面布局:一个照相按钮,一个从相册选择图片按钮,一个ImageView用来显示图片,代码和图片不再给出



    1、用相机拍摄照片并显示
    (解释见代码注释)


    mTakePhotoButton.setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				// new一个File用来存放拍摄到的照片
    				// 通过getExternalStorageDirectory方法获得手机系统的外部存储地址
    				File imageFile = new File(Environment
    						.getExternalStorageDirectory(), "tempImage.jpg");
    				// 如果存在就删了重新创建
    				try {
    					if (imageFile.exists()) {
    						imageFile.delete();
    					}
    					imageFile.createNewFile();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    				// 将存储地址转化成uri对象
    				imageUri = Uri.fromFile(imageFile);
    				// 设置打开照相的Intent
    				Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
    				// 设置相片的输出uri为刚才转化的imageUri
    				intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    				// 开启相机程序,设置requestCode为TOKE_PHOTO
    				startActivityForResult(intent, TAKE_PHOTO);
    
    			}
    		});
    
    			startActivityForResult(intent, CROP_PHOTO);
    
    			}
    		});
    
    	}
    
    	@Override
    	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    		switch (requestCode) {
    		// 从拍照界面返回
    		case TAKE_PHOTO:
    			if (resultCode == RESULT_OK) {
    				// 设置intent为启动裁剪程序
    				Intent intent = new Intent("com.android.camera.action.CROP");
    				// 设置Data为刚才的imageUri和Type为图片类型
    				intent.setDataAndType(imageUri, "image/*");
    				// 设置可缩放
    				intent.putExtra("scale", true);
    				// 设置输出地址为imageUri
    				intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    				// 开启裁剪,设置requestCode为CROP_PHOTO
    				startActivityForResult(intent, CROP_PHOTO);
    			}
    
    			break;
    		// 从裁剪界面返回
    		case CROP_PHOTO:
    			if (resultCode == RESULT_OK) {
    				Bitmap bitmap;
    				try {
    					//通过BitmapFactory将imageUri转化成bitmap
    					bitmap = BitmapFactory.decodeStream(getContentResolver()
    							.openInputStream(imageUri));
    					//设置显示
    					mPhotoImageView.setImageBitmap(bitmap);
    				} catch (FileNotFoundException e) {
    					e.printStackTrace();
    				}
    			}
    			
    			break;
    		default:
    			break;
    		}
    	}


    2、从相册选取照片显示

    按钮点击的方法

    mChoosePhotoButton.setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				//同样new一个file用于存放照片
    				File imageFile = new File(Environment
    						.getExternalStorageDirectory(), "outputImage.jpg");
    				if (imageFile.exists()) {
    					imageFile.delete();
    				}
    				try {
    					imageFile.createNewFile();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    				}
    				//转换成Uri
    				imageUri = Uri.fromFile(imageFile);
    				//开启选择呢绒界面
    				Intent intent = new Intent("android.intent.action.GET_CONTENT");
    				//设置可以缩放
    				intent.putExtra("scale", true);
    				//设置可以裁剪
    				intent.putExtra("crop", true);
    				intent.setType("image/*");
    				//设置输出位置
    				intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    				//开始选择
    				startActivityForResult(intent, CHOOSE_PHOTO);
    
    			}
    		});
    
    	}
    本来处理uri时和拍摄照片用的同样的方法,通过BitmapFactory转换成bitmap对象,发现不可行,好像是android版本的原因,生成的Path不一样,然后百度了好久找不到解决方案,最后谷歌瞬间找到很多网页讲述这个的,不得不说以后搜索还是用谷歌好。先上代码


    onActivityResult


    case CHOOSE_PHOTO:
    			if(resultCode==RESULT_OK){
    			handleImageOnKitkat(data);
    			}
    			break;



    @TargetApi(Build.VERSION_CODES.KITKAT)
    	private void handleImageOnKitkat(Intent data) {
    		String imagePath = null;
    		Uri uri = data.getData();
    		if (DocumentsContract.isDocumentUri(this, uri)) {
    			// 如果是document类型的Uri,则通过document id处理
    			String docId = DocumentsContract.getDocumentId(uri);
    			if ("com.android.providers.media.documents".equals(uri
    					.getAuthority())) {
    				String id = docId.split(":")[1]; // 解析出数字格式的id
    				String selection = MediaStore.Images.Media._ID + "=" + id;
    				imagePath = getImagePath(
    						MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
    			} else if ("com.android.providers.downloads.documents".equals(uri
    					.getAuthority())) {
    				Uri contentUri = ContentUris.withAppendedId(
    						Uri.parse("content://downloads/public_downloads"),
    						Long.valueOf(docId));
    				imagePath = getImagePath(contentUri, null);
    			}
    		} else if ("content".equalsIgnoreCase(uri.getScheme())) {
    			// 如果不是document类型的Uri,则使用普通方式处理
    			imagePath = getImagePath(uri, null);
    		}
    		displayImage(imagePath); // 根据图片路径显示图片
    		System.err.println(imagePath);
    	}
    
    	private String getImagePath(Uri uri, String selection) {
    		String path = null;
    		// 通过uri和selection来获取真实的图片路径
    		Cursor cursor = getContentResolver().query(uri, null, selection, null,
    				null);
    		if (cursor != null) {
    			if (cursor.moveToFirst()) {
    				path = cursor.getString(cursor
    						.getColumnIndex(MediaStore.Images.Media.DATA));
    			}
    			cursor.close();
    		}
    		return path;
    	}
    
    	private void displayImage(String imagePath) {
    		if (imagePath != null) {
    			Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
    			mPhotoImageView.setImageBitmap(bitmap);
    		} else {
    			Toast.makeText(this, "failed to get image", Toast.LENGTH_SHORT)
    					.show();
    		}
    	}

    目前这段代码看的似懂非懂,先存下来,留着进一步学习!


    程序截图








    一个多项的dialog的使用

    <span style="font-size:14px;">new AlertDialog.Builder(this).setItems(
    				new String[] { "拍摄照片", "从相册选择" },
    				new DialogInterface.OnClickListener() {
    
    					@Override
    					public void onClick(DialogInterface dialog, int which) {
    						switch (which) {
    						case 0:
    							takePhoto();
    							break;
    						case 1:
    							getPhotoFromAlbum();
    							break;
    						default:
    							break;
    						}
    					}
    				}).show();</span><span style="font-size: 18px;">
    </span>


    展开全文
  • 最近项目在做一个功能:就是需要从用户选择头像跳转到相册选择图片,这应该是一个很简单的需求,但是在网上搜了一下有好多都讲的很乱,其实用几十行代码就可以实现的为什么要说的那么复杂呢,下面就简单说一下喽。...
  • 上一篇文章简单介绍了图片的加载,但是实际业务中,加载图片的需求会比这复杂得多,例如这篇博客要讲的多选相册的实现,会涉及到下面几个问题:   1、 取得图片路径:这里涉及到contentprovider,不是本文重点,...
  • 从相册或拍照更换图片功能的实现:(取图无裁剪功能) 获取图片方式:(类似更换头像的效果) ...创建xml布局文件(activity_main.xml ): 头部两个Button按钮,一个控制从相册选择照片,一个控制启动...
  • Android7.0 拍照 选择照片 权限 实现
  • Android照片选择界面 2019-07-21 15:25:59
    package cc.vv.btongbaselibrary.ui.view....import android.Manifest;import android.animation.Animator;import android.animation.AnimatorListenerAdapter;import android.animation.ObjectAnimator;im...
  • 更换头像或者上传图片功能已基本是每个 APP 所具备的基础功能了,但这对于开发者来说是一个很麻烦的事情,除机型之外,适配版本就至少要考虑这几种情况(6.0以下版本、6.0的动态权限、7.0的FileProvider、8.0的特殊...
  • android7.0拍照或相册选择照片并裁剪 如果您觉得我的代码还行,并使用我的代码,请给我的资源5星评价,这是对我最大的支持。也让更多的android开发者可以用到。 感谢郭霖,感谢...
  • 简介:基于Laevatein扩展的图片选择器,可以让开发者自由选择图片加载库,比如可配置为Picasso,Glide,Android-Universal-Image-Loader,也可以自定义图片加载库,只需实现Engine接口即可。 支持第一个item为相机...
  • Android图片选择器功能 2018-07-24 12:32:26
    图片选择功能用的是GitHub...该依赖库是Android平台上拍照/录像,图片/视频选择,编辑和压缩的一站式解决方案。 添加依赖,在app-&gt;build.gradle里面添加依赖 //图片/视频选择、预览、编辑与拍照 implement...
  • Android 图片选择 2018-06-28 10:42:12
    多选 单选 主要功能 图片缩放 图片裁剪 ...可修改选择器列数 ...可自定义定义选择器顶部toolbar的背景色 使用方式 在项目目录下build.gradle中添加 allprojects { repositories ...
  • 现在大多数app都有选择图片上传的功能,自己开发的SDK有类似的功能,所以就参考些许资料自己实现了下,虽然不是太复杂的功能,但是涉及到的知识点还是可圈可点的,所以博主在此总结下来供自己以后参阅,算是个学习...
  • 图片选择器PictureSelector https://github.com/LuckSiege/PictureSelector 添加依赖 api 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.3' 添加权限 <uses-permission android:name=...
  • 项目要用到多图片上传选择和展示的功能,在github找到了个效果看起来不错的demo,悲剧的是下载完zip后浏览器卡死了,没记住地址,如有侵权请联系。。。话不多少,先看效果:这个库叫做 PhotoPicker 使用起来也特别...
  • 好久没有写过文章了,最近一直在忙公司桌面维护的一些事情,前几天接到一个写一个仿微信选择多张图片的任务,今天来总结一下。发现一个非常好用的图片选择库,下面来说一下这个库的用法: 1.通过Gradle抓取和导入Jar...
  • 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41874561,本文出自:【张鸿洋的博客】1、概述优秀的图片加载框架不要太多,什么UIL , Volley ,Picasso,Imageloader等等。...
  • 最终效果图: 实现方案:自定义一个父容器RelativeLayout将ImageView放入父容器中并初始化一个和ImageView相同大小的DrawingView来做涂鸦层最后将ImageView和DrawingView重叠部分生成Bitmap。...
  • 1.适配 android7.0 系统 2.解决部分机型裁剪闪退问题 4.解决图片过大 oom 闪退问题 5.动态获取系统权限,避免闪退 6.支持相片 or 视频的单选和多选 7.支持裁剪比例设置,如常用的 1:1、3:4、3:2、16:9 默认为...
  • Android图片单选/多选、拍照、裁剪、压缩。视频选择和录制。public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); ThemeConfig theme = new ThemeConfig....
  • android 调用系统拍照、选择本地照片
1 2 3 4 5 ... 20
收藏数 23,216
精华内容 9,286