选择照片、拍照裁剪上传
2017-02-14 22:11
288 查看
在做项目时免不了要上传用户头像这些操作,有时是从相册里面直接取,有时是使用照相机拍照过后进行截图的,现在来实现以下这两种方法。
布局文件Java代码
布局文件,使用了个第三方的圆形ImageView:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="circleimageview.myself.com.croppicturedemo.MainActivity"> <Button android:id="@+id/btn_pic" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="相册" /> <Button android:id="@+id/btn_cammer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/btn_pic" android:text="相机" /> <de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/iv" android:layout_width="96dp" android:layout_height="96dp" app:civ_border_color="#FF000000" app:civ_border_width="2dp" /> </RelativeLayout>
java代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { /** * 指定拍摄图片文件位置避免获取到缩略图 */ private File outFile; /** * 选择头像相册选取 */ private static final int REQUESTCODE_PICK = 1; /** * 裁剪好头像-设置头像 */ private static final int REQUESTCODE_CUTTING = 2; /** * 选择头像拍照选取 */ private static final int PHOTO_REQUEST_TAKEPHOTO = 3; /** * 裁剪好的头像的Bitmap */ private Bitmap currentBitmap; private CircleImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn_pic = (Button) findViewById(R.id.btn_pic); Button btn_cammer = (Button) findViewById(R.id.btn_cammer); btn_pic.setOnClickListener(this); btn_cammer.setOnClickListener(this); iv = (CircleImageView)findViewById(R.id.iv); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_pic: openPic(); break; case R.id.btn_cammer: openCamera(); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // 进行判断是那个操作跳转回来的,如果是裁剪跳转回来的这块就要把图片现实到View上,其他两种的话都把数据带入裁剪界面 switch (requestCode) { //相册 case REQUESTCODE_PICK: if (data == null || data.getData() == null) { return; } startPhotoZoom(data.getData()); //图片的路径 String s = data.getData().getPath().toString(); Log.i("ss","相片的路径:"+s); break; //裁剪 case REQUESTCODE_CUTTING: if (data != null) { setPicToView(data); } break; //拍照 case PHOTO_REQUEST_TAKEPHOTO: startPhotoZoom(Uri.fromFile(outFile)); //图片的路径 String s2 = Uri.fromFile(outFile).getPath().toString(); Log.i("ss","照相机照的照片路径:"+s2); break; } super.onActivityResult(requestCode, resultCode, data); } /** * 把裁剪好的图片设置到View上或者上传到网络 * * @param data */ private void setPicToView(Intent data) { Bundle extras = data.getExtras(); if (extras != null) { /** 可用于图像上传 */ currentBitmap = extras.getParcelable("data"); iv.setImageBitmap(currentBitmap); } } /** * 调用系统的图片裁剪 * * @param data */ private void startPhotoZoom(Uri data) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(data, "image/*"); intent.putExtra("crop", true); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 300); intent.putExtra("outputY", 300); intent.putExtra("scale", true);//黑边 intent.putExtra("scaleUpIfNeeded", true);//黑边 intent.putExtra("return-data", true); intent.putExtra("noFaceDetection", true); Uri cropUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath() + "/wangjunling/image/crop.png")); intent.putExtra(MediaStore.EXTRA_OUTPUT,cropUri); startActivityForResult(intent, REQUESTCODE_CUTTING); String s1 = cropUri.getPath().toString(); Log.i("ss","截图的路径:"+s1); } /** * 打开相册 */ private void openPic() { Intent pickIntent = new Intent(Intent.ACTION_PICK, null); pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*"); startActivityForResult(pickIntent, REQUESTCODE_PICK); } /** * 打开相机 */ private void openCamera() { String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File outDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); if (!outDir.exists()) { outDir.mkdirs(); } outFile = new File(outDir, System.currentTimeMillis() + ".jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outFile)); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); startActivityForResult(intent, PHOTO_REQUEST_TAKEPHOTO); } else { Log.e("CAMERA", "请确认已经插入SD卡"); } } }
相关文章推荐
- Android 拍照,从图库选择照片,并裁剪,上传到服务器
- android调用摄像头拍照,从相册中选择照片并裁剪
- 带你实现拍照||从相册选择->裁剪->上传服务器
- 个人界面 < 头像 > 图片选择(相册,拍照)--如何调用系统的相册,裁剪并且上传
- Android拍照或图库选择照片上传(附服务器端代码)
- TakePhoto是一款用于在Android设备上获取照片(拍照或从相册、文件中选择)、裁剪图片、压缩图片的开源工具库,目前最新版本3.0.0。
- Android实现批量照片上传至server,拍照或者从相冊选择
- Android 中拍照、相册选择、裁剪照片
- Android实现批量照片上传至服务器,拍照或者从相册选择
- 如何兼容所有Android版本选择照片或拍照然后裁剪图片--基于FileProvider和动态权限的实现
- Android开发之头像上传(包含拍照,从相册选择图片,裁剪等)
- android 选择图片拍照并剪切照片上传到服务器
- IOS10.3上传照片只能拍照不能选择解决办法
- html5规定数量手机拍照、选择相册照片base64编码上传
- 相机选择照片及拍照后使用AFNetworking图片上传(支持一张及多张上传)
- 兼容SDK4.4(api19)拍照、相册选择图片裁剪压缩上传头像
- 安卓拍照和选择照片上传功能代码
- Android开发--拍照选择照片裁剪
- Android 图片压缩、照片选择、裁剪,上传、一整套图片解决方案
- 获取本地照片和拍照上传并裁剪的实现