图片选择器(支持相册和相机),只需一步实现
来源:互联网 发布:yii2.0开源项目源码 编辑:程序博客网 时间:2024/05/20 15:21
写了一段时间的代码,发现老是做些重复的工作,效率低。其实很多是可以优化封装成库,下次使用时,能快速集成,减少开发时间。
图片选择器是很多app都用到的,我给他封装了一下,只需一步。
只要继承BaseCameraActivity,设置下监听器就好了
public class MainActivity extends BaseCameraActivity implements BaseCameraActivity.OnSelectPhotoInterface { @Bind(R.id.imageview) public ImageView mIndexIv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); setOnSelectPhotoListener(this); } @OnClick(R.id.gallery_select_btn) public void clickGallerySelect(){// startChoosePhotoByDialogMode(); startChoosePhotoByInlineMode(); } @Override public void onCropImageCancel() { } @Override public void onCropImageDone(String imagePath) { Bitmap bitmap = BitmapUtils.getBitmapAutoResize(imagePath, this); if(bitmap != null){ mIndexIv.setImageBitmap(bitmap); } } @Override protected void onDestroy() { ButterKnife.unbind(this); super.onDestroy(); }}
这是主activity,就这么简单。
BaseCameraActivity
public class BaseCameraActivity extends Activity { public final static String SDPATH = Environment.getExternalStorageDirectory() + "/"; private static final int CODE_RESULT_OPEN_CAMERA = 100; private static final int CODE_RESULT_OPEN_GALLERY = 101; private static final int CODE_RESULT_CROP_IMAGE = 102; public final static String SDPATH_APP_ROOT = SDPATH + "weread"; public static final String INTENT_KEY_IMAGE_PATH = "intent_key_image_path"; public static final String INTENT_KEY_CROPED_IMAGE_PATH = "intent_key_croped_image_path"; private String mPhotoImagePath; private void openCamera() { DebugTools.d("photo2 openCamera"); String status = Environment.getExternalStorageState(); if (status.equals(Environment.MEDIA_MOUNTED)) { File dir = new File(SDPATH_APP_ROOT); if(!dir.exists()){ dir.mkdirs(); } Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File file = new File(dir, String.valueOf(System.currentTimeMillis())+ ".jpg"); Uri imageUri = Uri.fromFile(file); mPhotoImagePath = file.getAbsolutePath(); openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); openCameraIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); startActivityForResult(openCameraIntent, CODE_RESULT_OPEN_CAMERA); } else { Toast.makeText(this, "没有储存卡", Toast.LENGTH_LONG).show(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { DebugTools.d("photo2 onActivityResult"); switch (requestCode) { case CODE_RESULT_OPEN_CAMERA: handleActivityResultByOpenCamera(); break; case CODE_RESULT_CROP_IMAGE: handleActivityResultByCropImage(data); break; case CODE_RESULT_OPEN_GALLERY: handleActivityResultByGallery(data); break; } super.onActivityResult(requestCode, resultCode, data); } private void handleActivityResultByOpenCamera(){ boolean isCancel = isCancelPhoto(); DebugTools.d("photo2 photo and come back, isCancel: " + isCancel); if(!isCancel){ onPhotoImageDone(mPhotoImagePath); }else{ onPhotoImageCancel(); } } private void handleActivityResultByGallery(Intent data){ if(data == null){ return; } String path = data.getStringExtra(INTENT_KEY_IMAGE_PATH); if(TextUtils.isEmpty(path)){ openCamera(); }else{ onPhotoImageDone(path); } } private void handleActivityResultByCropImage(Intent data){ if(data == null){ return; } String path = data.getStringExtra(INTENT_KEY_CROPED_IMAGE_PATH); if(TextUtils.isEmpty(path)){ if(mOnSelectPhotoListener != null){ mOnSelectPhotoListener.onCropImageCancel(); } }else{ if(mOnSelectPhotoListener != null){ mOnSelectPhotoListener.onCropImageDone(path); } } } private boolean isCancelPhoto(){ return !CommonTools.isFileExist(mPhotoImagePath); } private void onPhotoImageDone(String imagePath){ DebugTools.d("photo2 onPhotoImageDone imagePath: " + imagePath); if(TextUtils.isEmpty(imagePath)){ return; } jump2CropImageActivity(imagePath); } private void onPhotoImageCancel(){ DebugTools.d("photo2 onPhotoImageCancel"); } private void jump2CropImageActivity(String imagePath){ DebugTools.d("photo2 jump2CropImageActivity imagePath: " + imagePath); Intent intent = new Intent(this, CropImageActivity.class); intent.putExtra(INTENT_KEY_IMAGE_PATH, imagePath); startActivityForResult(intent, CODE_RESULT_CROP_IMAGE); } protected void startChoosePhotoByDialogMode(){ showCameraGalleryDialog(); } protected void startChoosePhotoByInlineMode(){ jump2SelectPhotoPage(false); } private SelectCameraGalleryDialog mDialog; private void showCameraGalleryDialog(){ if(mDialog == null){ mDialog = new SelectCameraGalleryDialog(this); } setDialogListener(mDialog); if(!mDialog.isShowing()){ mDialog.show(); } } private void setDialogListener(SelectCameraGalleryDialog dialog){ dialog.setOnSelectCameraGalleryListener(new SelectCameraGalleryDialog.OnSelectCameraGalleryListener() { @Override public void onSelectCameraGallery(boolean isCamera) { if (isCamera) { openCamera(); } else { jump2SelectPhotoPage(true); } } }); } private void jump2SelectPhotoPage(boolean isDialogMode){ Intent intent = new Intent(this, SelectPhotoActivity.class); intent.putExtra(SelectPhotoActivity.KEY_IS_DIALOG_MODE, isDialogMode); startActivityForResult(intent, CODE_RESULT_OPEN_GALLERY); } private OnSelectPhotoInterface mOnSelectPhotoListener; public void setOnSelectPhotoListener(OnSelectPhotoInterface listener){ mOnSelectPhotoListener = listener; } public interface OnSelectPhotoInterface{ public void onCropImageCancel(); public void onCropImageDone(String imagePath); } @Override protected void onDestroy() { ButterKnife.unbind(this); super.onDestroy(); }}
SelectPhotoActivity,选择图库
public class SelectPhotoActivity extends Activity implements PhotoAsyncTask.LoaderCallbacks, View.OnClickListener{ public static final String KEY_INTENT_ALBUM_LIST = "key_intent_album_list"; public static final String KEY_INTENT_IMAGE_LIST = "key_intent_image_list"; public static final String KEY_SAVE_ALBUM_LIST = "key_save_album_list"; public static final String KEY_SAVE_IMAGE_LIST = "key_save_image_list"; public static final String KEY_IS_DIALOG_MODE = "KEY_IS_DIALOG_MODE"; private static final int INTENT_RESULT_JUMP_ABLUM_PAGE = 101; private GridView mRecyclerView; private SelectPhotoAdapter mAdapter; private ArrayList<ImageItem> mDataList = new ArrayList<ImageItem>(); private ArrayList<ImageBucket> mBucketList = new ArrayList<ImageBucket>(); private boolean mIsDialogMode = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_select_photo); initView(); initWidget(); setupListener(); loadData(savedInstanceState); } private void initView(){ mRecyclerView = (GridView)findViewById(R.id.recyclerview); } private void initWidget(){ initParams(); mAdapter = new SelectPhotoAdapter(this, mDataList); mRecyclerView.setAdapter(mAdapter); } private void initParams(){ Intent intent = getIntent(); if(intent != null){ mIsDialogMode = intent.getBooleanExtra(KEY_IS_DIALOG_MODE, true); } } private void setupListener(){ findViewById(R.id.album_tv).setOnClickListener(this); findViewById(R.id.close_ib).setOnClickListener(this); mAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(int position) { handleItemClick(position); } }); } private void handleItemClick(int position){ Intent data = new Intent(); ImageItem item = mDataList.get(position); String path = item.getPath(); if(item.getIsCamera() == 1){ path = ""; } data.putExtra(BaseCameraActivity.INTENT_KEY_IMAGE_PATH, path); setResult(RESULT_OK, data); finish(); } private void loadData(Bundle savedInstanceState){ if(savedInstanceState == null){ new PhotoAsyncTask(this, this, !mIsDialogMode).execute(); }else{ onRestoreInstance(savedInstanceState); } } private void onRestoreInstance(Bundle savedInstanceState){ ArrayList<ImageItem> dataList = savedInstanceState.getParcelableArrayList(KEY_SAVE_IMAGE_LIST); ArrayList<ImageBucket> bucketList = savedInstanceState.getParcelableArrayList(KEY_SAVE_ALBUM_LIST); DebugTools.d("save2 onRestoreInstance dataList size: " + dataList.size() + " bucketList size: " + bucketList.size()); mDataList.addAll(dataList); mAdapter.notifyDataSetChanged(); mBucketList.addAll(bucketList); } @Override protected void onSaveInstanceState(Bundle outState) { DebugTools.d("save2 onSaveInstanceState"); outState.putParcelableArrayList(KEY_SAVE_IMAGE_LIST, mDataList); outState.putParcelableArrayList(KEY_SAVE_ALBUM_LIST, mBucketList); super.onSaveInstanceState(outState); } @Override public void onLoadFinished(ArrayList<ImageItem> dataList, ArrayList<ImageBucket> bucketList) { mDataList.clear(); mDataList.addAll(dataList); mAdapter.notifyDataSetChanged(); mBucketList.addAll(bucketList); } @Override public void onClick(View v) { int id = v.getId(); if(id == R.id.album_tv){ handleClickAlbum(); }else if(id == R.id.close_ib){ finish(); } } private void handleClickAlbum(){ jump2AlbumPage(mBucketList); } private void jump2AlbumPage(ArrayList<ImageBucket> bucketList){ Intent intent = new Intent(this, SelectAlbumActivity.class); intent.putParcelableArrayListExtra(KEY_INTENT_ALBUM_LIST, bucketList); startActivityForResult(intent, INTENT_RESULT_JUMP_ABLUM_PAGE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case INTENT_RESULT_JUMP_ABLUM_PAGE: hanleActivityBackFromAblum(data); break; } } private void hanleActivityBackFromAblum(Intent data){ if(data == null){ return; } findViewById(R.id.album_tv).setVisibility(View.INVISIBLE); ArrayList<ImageItem> dataList = data.getParcelableArrayListExtra(KEY_INTENT_IMAGE_LIST); if(dataList != null && dataList.size() > 0){ mDataList.clear(); mDataList.addAll(dataList); mAdapter.notifyDataSetChanged(); } }}
SelectAlbumActivity,选择图库里面的专辑
public class SelectAlbumActivity extends Activity { public static final String KEY_SAVE_IMAGE_LIST = "key_save_image_list"; private GridView mRecyclerView; private SelectAlbumAdapter mAdapter; private ArrayList<ImageBucket> mDataList = new ArrayList<ImageBucket>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_select_album); initView(); initWidget(); setupListener(); loadData(savedInstanceState); } private void initView(){ mRecyclerView = (GridView)findViewById(R.id.recyclerview); } private void initWidget(){ mAdapter = new SelectAlbumAdapter(this, mDataList); mRecyclerView.setAdapter(mAdapter); } private void setupListener(){ mAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(int position) { handleItemClick(position); } }); findViewById(R.id.close_ib).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } private void handleItemClick(int position){ Intent data = new Intent(); data.putParcelableArrayListExtra(SelectPhotoActivity.KEY_INTENT_IMAGE_LIST, mDataList.get(position).getDataList()); setResult(RESULT_OK, data); finish(); } private void loadData(Bundle savedInstanceState){ if(savedInstanceState == null){ initParams(); }else{ onRestoreInstance(savedInstanceState); } } private void onRestoreInstance(Bundle savedInstanceState){ ArrayList<ImageBucket> bucketList = savedInstanceState.getParcelableArrayList(KEY_SAVE_IMAGE_LIST); mDataList.addAll(bucketList); mAdapter.notifyDataSetChanged(); } @Override protected void onSaveInstanceState(Bundle outState) { outState.putParcelableArrayList(KEY_SAVE_IMAGE_LIST, mDataList); super.onSaveInstanceState(outState); } private void initParams(){ Intent intent = getIntent(); if(intent != null){ ArrayList<ImageBucket> dataList = intent.getParcelableArrayListExtra(SelectPhotoActivity.KEY_INTENT_ALBUM_LIST); mDataList.clear(); mDataList.addAll(dataList); mAdapter.notifyDataSetChanged(); } }}
SelectCameraGalleryDialog,弹出是选择图库,还是相机的对话框
public class SelectCameraGalleryDialog extends Dialog implements View.OnClickListener{ private Context mContext; private TextView mCameraTv; private TextView mGalleryTv; public SelectCameraGalleryDialog(Context context) { super(context, R.style.DialogNormalStyle); mContext = context; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View view = LayoutInflater.from(mContext).inflate(R.layout.library_camera_dialog_select_camera_gallery, null); initView(view); initWidget(); setupListener(view); } private void initView(View view){ mCameraTv = (TextView)view.findViewById(R.id.camera_type_tv); mGalleryTv = (TextView)view.findViewById(R.id.gallery_type_tv); setContentView(view); } private void setupListener(View view){ mCameraTv.setOnClickListener(this); mGalleryTv.setOnClickListener(this); view.findViewById(R.id.cancel_tv).setOnClickListener(this); } private void initWidget(){ initWidthHeight(); } private void initWidthHeight(){ int[] arr = getScreenWidthHeight(mContext); Window window = this.getWindow(); WindowManager.LayoutParams params = window.getAttributes(); params.width = arr[0] * 8 / 9; window.setAttributes(params); window.setGravity(Gravity.BOTTOM); } private int[] getScreenWidthHeight(Context context) { int[] posArr = new int[2]; if (context == null) { return posArr; } DisplayMetrics mDisplayMetrics = new DisplayMetrics(); ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics); int width = mDisplayMetrics.widthPixels; int height = mDisplayMetrics.heightPixels; posArr[0] = width; posArr[1] = height; return posArr; } @Override public void onClick(View v) { if(v.getId() == R.id.camera_type_tv){ handleClickCameraGallery(true); }else if(v.getId() == R.id.gallery_type_tv){ handleClickCameraGallery(false); }else if(v.getId() == R.id.cancel_tv){ dismiss(); } } private void handleClickCameraGallery(boolean isCamera){ if(mListener != null){ mListener.onSelectCameraGallery(isCamera); } dismiss(); } public OnSelectCameraGalleryListener mListener; public void setOnSelectCameraGalleryListener(OnSelectCameraGalleryListener listener){ mListener = listener; } public interface OnSelectCameraGalleryListener{ public void onSelectCameraGallery(boolean isCamera); }}
其实也不难,只是封装了一下,下次方便使用
源代码地址:http://download.csdn.net/detail/paddyy/9414162
0 0
- 图片选择器(支持相册和相机),只需一步实现
- 打开相机和获取相册图片后实现裁剪
- Android实现读取相机(相册)图片并进行剪裁
- android 调用相机和获取相册图片
- 上传图片(来源:相机和相册)
- Android中的支持拍照和选择本地相册的图片选择器
- Android webview支持type="file" 打开相机和相册,支持小米(亲测6.0通过)
- iOS- 选择图片(相机/相册)
- android上传图片(相机,相册)
- 实现相机拍照和相册裁剪
- 图片选择器,可以通过相册或者相机选择图片,可以进行图片裁剪。
- Android 实现拍照和调用相册取多张图片,以下只展示两张图片
- iOS图片处理(一)调用系统相机和相册获取图片,给相机添加自定义覆盖物
- 从数据库读取和写入图片(包含调用相册和相机)
- Android之圆形头像(实现相机拍摄+相册选择+图片裁剪功能)
- 用Swift实现iOS相机及相册图片上传
- RxJava+Retrofit+MVP实现相册相机图片上传
- 安卓基础--实现从系统相机,相册获取图片
- php读取超大日志文件
- poj 3304 Segments
- 【代码笔记】iOS-电影上的花絮,自动滚动
- TiDB:支持 MySQL 协议的分布式数据库解决方案
- 设置navigationbar的标题样式和背景颜色
- 图片选择器(支持相册和相机),只需一步实现
- GitHub详细教程
- RMI实现例子
- 编译器警告和错误详解
- iOS 9之应用内搜索(CoreSpotlight)API
- 编程之美中CPU运行曲线题目(多核版本)
- 测试网络连接状态
- 严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderLis
- HTTP幂等性