Android从相册选择图片和调用系统摄像头拍照
来源:互联网 发布:java 圆周率 编辑:程序博客网 时间:2024/05/21 10:43
Android开发中很多情况下需要从图册或者相机中获取到图片,
下面就分享一个小栗子。
效果为从相册或者拍照获得的图片然后设置给界面中的ImageView。
至于对话框的弹出方式这里就不赘述了,请自行参考:
Android实现QQ换头像的对话框
http://blog.csdn.net/u014112893/article/details/52801447
在最底下会给出APK和源码。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.dialogtest.MainActivity"> <Button android:id="@+id/btn_show_dialog" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/show_dialog" /> <ImageView android:id="@+id/img" android:layout_width="300dp" android:layout_height="300dp" /></LinearLayout>
主界面中只有一个按钮和一个显示图片的控件。
此Demo采用了比较简单的MVP模式(Model-View-Presenter),
在View中写抽象接口,然后主要在presenter中写逻辑事件,在这个
Demo中没用到模型Model。
public interface IHeaderView { //用于图片获取成功设置给ImageView void setHeaderBitmap(Bitmap bitmap);}
点击按钮弹出选择对话框:
@Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_show_dialog: headerPresenter.showHeadDialog(); break; } }
HeaderPresenter:
package mvp.presenter;import android.app.Activity;import android.app.Dialog;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.Window;import android.view.WindowManager;import android.widget.Toast;import com.hcc.selectphototest.R;import java.io.File;import mvp.view.IHeaderView;/** * Created by ${hcc} on 2016/10/17. */public class HeaderPresenter { private IHeaderView iHeaderView; private Context context; public HeaderPresenter(IHeaderView iHeaderView, Context context) { this.iHeaderView = iHeaderView; this.context = context; } /*设置并显示Dialog*/ public void showHeadDialog() { View view = LayoutInflater.from(context).inflate(R.layout.head_dialog, null); final Dialog dialog = new Dialog(context, R.style.transparentFrameWindowStyle); dialog.setContentView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); Window window = dialog.getWindow(); window.setWindowAnimations(R.style.anim_style); WindowManager.LayoutParams layoutParams = window.getAttributes(); layoutParams.x = 0; layoutParams.y = ((Activity) context).getWindowManager().getDefaultDisplay().getHeight(); layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; //保证dialog窗体可以水平铺满 layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT; dialog.onWindowAttributesChanged(layoutParams);//设置dialog的摆放位置 dialog.setCanceledOnTouchOutside(true);//设置点击dialog以为的区域dialog消失 dialog.show();/*相册选择*/ dialog.findViewById(R.id.tv_select_photo).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { selectFromAlbum(); if (dialog.isShowing()) { dialog.dismiss(); } } });/*拍照*/ dialog.findViewById(R.id.tv_take_photo).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { takePhoto(); if (dialog.isShowing()) { dialog.dismiss(); } } }); dialog.findViewById(R.id.tv_cancel).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); } //从相册获取 private void selectFromAlbum() { Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); ((Activity) context).startActivityForResult(intent, 2); } //拍照 private void takePhoto() { String state = Environment.getExternalStorageState(); /*判断是否有SD卡*/ if (state.equals(Environment.MEDIA_MOUNTED)) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile( new File(Environment.getExternalStorageDirectory(), "iMon.jpg"))); ((Activity) context).startActivityForResult(intent, 3); } else { Toast.makeText(context, "内存卡不存在", Toast.LENGTH_LONG).show(); } } //裁剪图片 public void startPhotoZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); //下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 150); intent.putExtra("outputY", 150); intent.putExtra("return-data", true); if (context instanceof Activity) { ((Activity) context).startActivityForResult(intent, 4); } } //设置给视图 public void setView(Intent date) { Bundle bundle = date.getExtras(); Bitmap bitmap = bundle.getParcelable("data"); iHeaderView.setHeaderBitmap(bitmap); }}
从图册、拍照和裁剪分别有一个请求码,然后主要从MainActivity
中接收,重写onActivityResult,根据不同的请求码做出不同的响
应。
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 点击取消按钮 if (resultCode == RESULT_CANCELED) { return; } switch (requestCode) { case 2: Uri uri = data.getData(); headerPresenter.startPhotoZoom(uri); break; case 3: File file = new File(Environment.getExternalStorageDirectory() + "/" + "iMon.jpg"); headerPresenter.startPhotoZoom(Uri.fromFile(file)); break; case 4: if (data != null) { headerPresenter.setView(data); } break; } }
case 4代表剪裁完成,剪裁完成后将Intent类型的date传给setView,
然后获取到bitmap对象设置给ImageView控件。
public void setView(Intent date) { Bundle bundle = date.getExtras(); Bitmap bitmap = bundle.getParcelable("data"); iHeaderView.setHeaderBitmap(bitmap);}
@Override public void setHeaderBitmap(Bitmap bitmap) { img.setImageBitmap(bitmap); }
这样就能实现从相册和相机中获取图片了。
安装包在源码根目录,传送>>>
0 0
- Android从相册选择图片和调用系统摄像头拍照
- 调用摄像头和相册(调用摄像头拍照和从相册中选择图片)
- Android上传图片之调用系统拍照和从相册选择图片
- Android上传图片之调用系统拍照和从相册选择图片
- 调用系统摄像头和相册选择图片
- Android 从相册和拍照选择图片
- Android 调用摄像头拍照 以及 从相册中选择照片
- 调用摄像头拍照和从相册中选择照片
- 调用摄像头拍照和从相册中选择
- Aandroid调用摄像头拍照和从相册选择照片
- Android之调用摄像头拍照和从相册中选择照片
- Android调用摄像头拍照和从相册中选择(上传、更换头像)
- 调用摄像头拍照和选择相册
- MUI 拍照和从系统相册选择图片上传
- 调用Android系统摄像头进行拍照以及从图库选择图片
- Android 调用系统相机拍照(适配7.0)、从图库选择图片;从数据库读取联系人信息、相册图片
- Android图片裁剪(拍照和从相册选择)
- Android多媒体之调用摄像头和从本地相册中选择图片
- tri树模板
- flex访问java服务器的httpservice的沙箱处理
- 关于@SuppressWarnings
- struts2重定向时传递参数的实现!以及传递参数为中文时的乱码问题解决!
- 洛谷 P1032 [NOIP2002 T2] 字串变换
- Android从相册选择图片和调用系统摄像头拍照
- C++入门:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数
- 谈谈软件开发项目管理的积分制
- docker基础:私有仓库repository搭建(1):registry
- 工具使用:sublimeText2
- 实习有感
- UVa - 624 - CD(0-1 + 记录路径)
- 久远银海学习笔记
- 使用 OSC Maven 第三方仓库