Android 调用系统相机拍照 2次剪裁. 选取本地相册
2018-03-20 15:37
579 查看
项目中,基本都有用户自定义头像或自定义背景的功能,实现方法一般都是调用系统相机–拍照,或者系统相册–选择照片,然后进行剪裁,最终设为头像或背景。
我直接贴上使用的代码吧!
这次偷懒了,没有做效果图,不过这是我试过的代码,可以,只不过不能选取原图,因为会导致OOM问题
2
3
4
5
6
7
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
使用另一种隐示意图
将Intent.ACTION_GET_CONTENT改为Intent.ACTION_PICK
我直接贴上使用的代码吧!
这次偷懒了,没有做效果图,不过这是我试过的代码,可以,只不过不能选取原图,因为会导致OOM问题
1.清单文件配置
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.hardware.camera.autofocus" />1
2
3
4
5
6
7
2.逻辑代码实现
private Button mCarema; private Button mPics; private ImageView mIamge; private static final int IMAGE_REQUEST_CODE = 0; // 本地图片 private static final int CAMERA_REQUEST_CODE = 1; // 拍照 private static final int RESULT_REQUEST_CODE = 2; // 裁剪 private static final String SAVE_AVATORNAME = "head.png";// 保存的图片名 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { mCarema = (Button) findViewById(R.id.carema); mCarema.setOnClickListener(this); mPics = (Button) findViewById(R.id.pics); mPics.setOnClickListener(this); mIamge = (ImageView) findViewById(R.id.iamge); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.carema: // TODO 18/03/17 //启用系统相机 Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), SAVE_AVATORNAME))); startActivityForResult(intentFromCapture, CAMERA_REQUEST_CODE); break; case R.id.pics: // TODO 18/03/17 //选择本地图片 Intent intentFromGallery = new Intent(); intentFromGallery.setType("image/*"); // 设置文件类型 intentFromGallery.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intentFromGallery, IMAGE_REQUEST_CODE); break; default: break; } } /** * 回调结果处理 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_CANCELED) { switch (requestCode) { case IMAGE_REQUEST_CODE://本地 startPhotoZoom(data.getData());//裁剪照片 break; case CAMERA_REQUEST_CODE://拍照 startPhotoZoom(Uri.fromFile(new File(Environment.getExternalStorageDirectory(), SAVE_AVATORNAME))); break; case RESULT_REQUEST_CODE://裁剪 if (data != null) { getImageToView(data);//保存图片 } break; } } super.onActivityResult(requestCode, resultCode, data); } /** * 裁剪图片方法实现 */ public void startPhotoZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 设置裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 300); intent.putExtra("outputY", 300); intent.putExtra("return-data", true); startActivityForResult(intent, RESULT_REQUEST_CODE); } /** * 保存裁剪之后的图片数据 */ private void getImageToView(Intent data) { Bundle extras = data.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); saveMyBitmap(photo); // 保存裁剪后的图片到SD Bundle bundle = data.getExtras(); if (bundle != null) { //在这里获得了剪裁后的Bitmap对象,可以用于上传 Bitmap image = bundle.getParcelable("data"); //设置到ImageView上 mIamge.setImageBitmap(image); //也可以进行一些保存、压缩等操作后上传 String path = saveImage("head", image); File file = new File(path);//生成了对应的文件,可以做上传 } } } /** * 将头像保存在SDcard */ public void saveMyBitmap(Bitmap bitmap) { File file = new File(Environment.getExternalStorageDirectory(), SAVE_AVATORNAME); try { file.createNewFile(); FileOutputStream fileOut = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOut); fileOut.flush(); fileOut.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 将图片保存到本地 * * @param name * @param bmp * @return */ public String saveImage(String name, Bitmap bmp) { File appDir = new File(Environment.getExternalStorageDirectory().getPath()); if (!appDir.exists()) { appDir.mkdir(); } String fileName = name + ".jpg"; File file = new File(appDir, fileName); try { FileOutputStream fos = new FileOutputStream(file); bmp.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); return file.getAbsolutePath(); } catch (IOException e) { e.printStackTrace(); } return null; }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
.注意,因为权限问题,所以,调用本地相册时,容易出现不同机型会有不同的显示效果 如果你的出现了问题,不妨看一下我的解决方案
使用另一种隐示意图
case R.id.pics: // TODO 18/03/17 //选择本地图片 Intent intentFromGallery = new Intent(); intentFromGallery.setType("image/*"); // 设置文件类型 intentFromGallery.setAction(**Intent.ACTION_GET_CONTENT**); startActivityForResult(intentFromGallery, IMAGE_REQUEST_CODE); break;
将Intent.ACTION_GET_CONTENT改为Intent.ACTION_PICK
相关文章推荐
- Android 调用系统相机拍照 . 选取本地相册
- Android 调用系统相机拍照 . 选取本地相册
- android中调用系统相机拍照并访问本地相册
- android 调用系统相册选取照片或者打开相机拍照获取图片
- android 调用系统相册选取照片或者打开相机拍照获取图片,返回时为什么会回到home界面或者到前一个界面,然后才会跳转到当前activity
- android 调用系统相册选取照片或者打开相机拍照获取图片,返回时回到手机桌面,然后才会跳转到当前activity
- android 调用系统相册选取照片或者打开相机拍照获取图片
- android 调用系统相册选取照片或者打开相机拍照获取图片,返回时回到手机桌面,然后才会跳转到当前activity
- Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题
- 调用系统相机拍照获取图片或者从相册中调用本地图片显示问题
- Android 调用系统相机拍照(适配7.0)、从图库选择图片、从数据库读取联系人信息、相册图片、扫描文件
- Android 调用系统相机拍照保存以及调用系统相册的方法
- 解决Android调用系统相机拍照后相片无法在相册中显示问题
- Android调用系统相机拍照、从相册中取照片,裁剪,并保存到手机SD卡中,展示到界面
- Android开发之调用相机拍照和调用系统相册
- Android 调用系统相机拍照保存以及调用系统相册的方法
- Android调用相册或相机拍照选取照片并裁剪
- Android调用系统相机拍照并存入相册
- android调用系统相机拍照并保存在本地
- Android 调用系统相机拍照保存以及调用系统相册的方法