安卓调用系统相机及相册,传递一张或者多张图片
2016-11-09 18:03
344 查看
一、系统相机:
打开相机:
回调:
二、系统相册:
打开相机:
回调:
注意:
三、仿微信上传多张图片
第三方库:一个选择图片的库,支持设置选择图片的张数
项目地址:https://github.com/zfdang/android-multiple-images-selector
1. 添加依赖库
2. 清单文件中声明权限以及Activity
3. Application类中Oncreat()方法中添加以下代码:
4. 主页面xml中包含Button和GridView
Button的点击事件监听:
GridView常用属性介绍:
android:numColumns=”auto_fit” // GridView的列数设置为自动
android:columnWidth=”90dp ” // 每列的宽度,也就是Item的宽度
android:verticalSpacing=”10dp” // 两行之间的边距
android:horizontalSpacing=”10dp” // 两列之间的边距
android:scrollbars=”none” // 隐藏GridView的滚动条
5. onActivityResult监听
path2Bitmap()方法如下:
getOptions()方法如下:
readPictureDegree()方法如下:
6. GridView适配器定义如下:
7. GridView的item点击事件监听:
附加:PopupWindow背景变暗
打开相机:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, CAMERA);
回调:
protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case CAMERA: if (data != null && data.getExtras() != null) { String sdStatus = Environment.getExternalStorageState(); // 检测sd是否可用 if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { return; } String name = new DateFormat().format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".jpg"; Toast.makeText(this, name, Toast.LENGTH_LONG).show(); Bundle bundle = data.getExtras(); // 获取相机返回的数据,并转换为Bitmap图片格式 Bitmap bitmap = (Bitmap) bundle.get("data"); FileOutputStream b = null; File file = new File("/sdcard/myImage/"); file.mkdirs();// 创建文件夹 String fileName = "/sdcard/myImage/" + name; try { b = new FileOutputStream(fileName); // 把数据写入文件 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { b.flush(); b.close(); } catch (IOException e) { e.printStackTrace(); } } // 将图片显示在ImageView里 image.setImageBitmap(bitmap); } break; } }
二、系统相册:
打开相机:
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent , PHOTO);
回调:
protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case PHOTO: if (data != null && data.getData() != null) { Uri selectedImage = data.getData(); ContentResolver cr = this.getContentResolver(); // 根据Uri从数据库中找 Cursor cursor = cr.query(selectedImage, null, null, null, null); if (cursor != null) { // 把游标移动到首位 cursor.moveToFirst(); // 获取图片路径 String filePath = cursor.getString(cursor .getColumnIndex("_data")); // 获取旋转的角度 String orientation = cursor.getString(cursor .getColumnIndex("orientation")); cursor.close(); if (filePath != null) { // 根据Path读取资源图片 Bitmap bit = BitmapFactory.decodeFile(filePath); int angle = 0; if (orientation != null && !"".equals(orientation)) { angle = Integer.parseInt(orientation); } if (angle != 0) { // 操作图片(旋转) Matrix m = new Matrix(); int width = bit.getWidth(); int height = bit.getHeight(); // 旋转angle度 m.setRotate(angle); // 生成新图片 bit = Bitmap.createBitmap(bit, 0, 0, width, height, m, true); } image.setImageBitmap(bit); } } } break; } }
注意:
<ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitXY" > </ImageView>
三、仿微信上传多张图片
第三方库:一个选择图片的库,支持设置选择图片的张数
项目地址:https://github.com/zfdang/android-multiple-images-selector
1. 添加依赖库
2. 清单文件中声明权限以及Activity
3. Application类中Oncreat()方法中添加以下代码:
Fresco.initialize(getApplicationContext());
4. 主页面xml中包含Button和GridView
Button的点击事件监听:
btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 初始化Intent Intent intent = new Intent(MainActivity.this, ImagesSelectorActivity.class); // 传递参数:最大选择数量 intent.putExtra(SelectorSettings.SELECTOR_MAX_IMAGE_NUMBER, 5); // 传递参数:最少显示数量 intent.putExtra(SelectorSettings.SELECTOR_MIN_IMAGE_SIZE, 100000); // 是否显示相机 intent.putExtra(SelectorSettings.SELECTOR_SHOW_CAMERA, true); // 传递参数:已选择图片集合 intent.putStringArrayListExtra(SelectorSettings.SELECTOR_INITIAL_SELECTED_LIST, mResults); // 打开选择页面 startActivityForResult(intent, REQUEST_CODE); } });
GridView常用属性介绍:
android:numColumns=”auto_fit” // GridView的列数设置为自动
android:columnWidth=”90dp ” // 每列的宽度,也就是Item的宽度
android:verticalSpacing=”10dp” // 两行之间的边距
android:horizontalSpacing=”10dp” // 两列之间的边距
android:scrollbars=”none” // 隐藏GridView的滚动条
5. onActivityResult监听
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // 获取结果 if (requestCode == REQUEST_CODE) { if (resultCode == RESULT_OK) { //清除集合 mImages.clear(); //赋值 mResults = data.getStringArrayListExtra(SelectorSettings.SELECTOR_RESULTS); Log.e("mResults", mResults.toString()); //转化为Bitmap path2Bitmap(mResults); } } super.onActivityResult(requestCode, resultCode, data); }
path2Bitmap()方法如下:
// 图片地址转化为Bitmap private void path2Bitmap(ArrayList<String> list) { for (int i = 0; i < list.size(); i++) { // path转化为bitmap // getOptions():图片参数 Bitmap bitmap = BitmapFactory.decodeFile(list.get(i), getOptions()); Matrix m = new Matrix(); int width = bitmap.getWidth(); int height = bitmap.getHeight(); // 旋转angle度 // readPictureDegree:获取旋转角度 m.setRotate(readPictureDegree(list.get(i))); // 生成新图片 bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, m, true); mImages.add(bitmap); } gridAdapter.notifyDataSetChanged(); }
getOptions()方法如下:
// 获取OPtions private BitmapFactory.Options getOptions() { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inTempStorage = new byte[100 * 1024]; //设置位图颜色显示优化方式 //ALPHA_8:每个像素占用1byte内存(8位) //ARGB_4444:每个像素占用2byte内存(16位) //ARGB_8888:每个像素占用4byte内存(32位) //RGB_565:每个像素占用2byte内存(16位) //Android默认的颜色模式为ARGB_8888,这个颜色模式色彩最细腻,显示质量最高。但同样的,占用的内存//也最大。也就意味着一个像素点占用4个字节的内存。 opts.inPreferredConfig = Bitmap.Config.RGB_565; //设置图片可以被回收,创建Bitmap用于存储Pixel的内存空间在系统内存不足时可以被回收 opts.inPurgeable = true; //设置位图缩放比例 opts.inSampleSize = 4; //设置解码位图的尺寸信息 opts.inInputShareable = true; return opts; }
readPictureDegree()方法如下:
//根据图片地址获取图片旋转角度 private int readPictureDegree(String path) { int degree = 0; try { ExifInterface exifInterface = new ExifInterface(path); int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: degree = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: degree = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: degree = 270; break; } } catch (IOException e) { e.printStackTrace(); } return degree; }
6. GridView适配器定义如下:
private class GridAdapter extends BaseAdapter { @Override public int getCount() { Log.e("size=", mImages.size() + ""); return mImages.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View view, ViewGroup viewGroup) { View mView = View.inflate(MainActivity.this, R.layout.item, null); ImageView imageView = (ImageView) mView.findViewById(R.id.image); imageView.setImageBitmap(mImages.get(i)); return mView; } }
7. GridView的item点击事件监听:
mGridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setMessage("确认移除已添加图片吗?"); builder.setTitle("提示"); builder.setPositiveButton("确认", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); // 从集合中删除对应位置的图片 mImages.remove(position); // 刷新GridView gridAdapter.notifyDataSetChanged(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } });
附加:PopupWindow背景变暗
private void backgroundAlpha(Activity context, float bgAlpha){ WindowManager.LayoutParams layoutParams = context.getWindow().getAttributes(); layoutParams .alpha = bgAlpha; context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); context.getWindow().setAttributes(layoutParams ); }
相关文章推荐
- android 调用系统相册选取照片或者打开相机拍照获取图片
- 调用系统相机拍照获取图片或者从相册中调用本地图片显示问题
- 安卓开发,从相册或者相机中选择一张图片并裁剪,上传和下载。
- android 调用系统相册选取照片或者打开相机拍照获取图片,返回时回到手机桌面,然后才会跳转到当前activity
- 安卓开发小米4,酷派 手机适配和调用系统相机相册做图片上传的问题
- Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题
- android 调用系统相册选取照片或者打开相机拍照获取图片,返回时回到手机桌面,然后才会跳转到当前activity
- android 调用系统相册选取照片或者打开相机拍照获取图片,返回时为什么会回到home界面或者到前一个界面,然后才会跳转到当前activity
- android 调用系统相册选取照片或者打开相机拍照获取图片
- 调用相机拍照并得到图片-------得到系统相册中一张图片
- Android 拍照以及一些常用的处理,例如将图片显示到相册(包含了安卓系统6.0以上调用相机的处理)
- ios 调用系统相机,图库,相册。将照片保存在相册,保存图片在本地,UIImagePickerController
- 安卓调用系统相机,通过路径返回清晰图片
- Anroid调用系统相机或相册获取图片
- Android基础--调用系统相机,打开相册,裁剪图片并展示到界面
- Android开发,调用相册图片或者调用相机进行拍照获取图片
- Android中调用系统相机、系统相册来获取图片,并裁剪图片。
- iOS之保存图片到系统相册和从系统相册选取一张或者多张照片
- iOS图片处理(一)调用系统相机和相册获取图片,给相机添加自定义覆盖物
- 安卓调用手机的相册与相机获取图片并适配到控件