您的位置:首页 > 移动开发 > Android开发

安卓调用系统相机及相册,传递一张或者多张图片

2016-11-09 18:03 344 查看
一、系统相机:

打开相机:

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 图片
相关文章推荐