选择图片上传基本是标配了,有必要写好个通用的方法以便使用,以下是一堆代码,使用的时候粘贴进去就可以了。
基本解决了一些常出现的问题:华为手机适配,6.0权限申请,图片大小控制。
1、关于权限问题,我们使用一个开源库:
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.mylhyl:acp:1.1.7'}相机与相册都需要读写权限,相机还需要照相权限。2、具体代码,拷贝就能用:
// 拍照成功,读取相册成功,裁减成功PRivate final int ALBUM_OK = 101, CAMERA_OK = 102, CUT_OK = 103;private File bitfile;private void xiangji() { Acp.getInstance(mContext).request(new AcpOptions.Builder().setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA).build(), new AcpListener() { @Override public void onGranted() { File dou = new File(Environment.getExternalStorageDirectory(), "dou"); if (!dou.exists()) { dou.mkdirs();// 2.创建相片的存储目录 } // 定义拍照后存放图片的文件位置和名称,使用完毕后可以方便删除 String fileName = new SimpleDateFormat("ss-SSS") .format(new Date()) + ".jpg"; bitfile = new File(dou, fileName); // 来自相机 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 下面这句指定调用相机拍照后的照片存储的路径 cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(bitfile)); startActivityForResult(cameraIntent, CAMERA_OK);// CAMERA_OK是用作判断返回结果的标识 } @Override public void onDenied(List<String> list) { Qiuutil.ShortToast(list.toString() + "权限拒绝"); } });}private void xiangce() { Acp.getInstance(PersonInfoActivity.this).request(new AcpOptions.Builder().setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).build(), new AcpListener() { @Override public void onGranted() { File dou = new File(Environment.getExternalStorageDirectory(), "dou"); if (!dou.exists()) { dou.mkdirs();// 2.创建相片的存储目录 } // 定义拍照后存放图片的文件位置和名称,使用完毕后可以方便删除 String fileName = new SimpleDateFormat("ss-SSS") .format(new Date()) + ".jpg"; bitfile = new File(dou, fileName); // 来自相册 Intent albumIntent = new Intent(Intent.ACTION_PICK, null); /** * 下面这句话,与其它方式写是一样的效果,如果: * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); * intent.setType(""image/*");设置数据类型 * 要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型" */ albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(albumIntent, ALBUM_OK); } @Override public void onDenied(List<String> list) { Qiuutil.ShortToast(list.toString() + "权限拒绝"); } });}/** * 裁剪图片方法实现 * * @param uri 图片uri * @param type 类别:相机,相册 */public void clipPhoto(Uri uri, int type) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下面这个crop = true是设置在开启的Intent中设置显示的VIEW可裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例,这里设置的是正方形(长宽比为1:1) intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 300); intent.putExtra("outputY", 300); intent.putExtra("return-data", false); /** * 此处做一个判断 * 1,相机取到的照片,我们把它做放到了定义的目录下。就是file * 2,相册取到的照片,这里注意了,因为相册照片本身有一个位置,我们进行了裁剪后,要给一个裁剪后的位置, * 不然onActivityResult方法中,data一直是null */ if (type == CAMERA_OK) { intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); } else { intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(bitfile)); } startActivityForResult(intent, CUT_OK);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { System.out.println("requestCode = " + requestCode); switch (requestCode) { // 如果是直接从相册获取 case ALBUM_OK: //从相册中获取到图片了,才执行裁剪动作 if (data != null) { clipPhoto(data.getData(), ALBUM_OK); //setPicToView(data); } break; // 如果是调用相机拍照时 case CAMERA_OK: // 当拍照到照片时进行裁减,否则不执行操作 if (bitfile.exists()) { clipPhoto(Uri.fromFile(bitfile), CAMERA_OK);//开始裁减图片 } break; // 取得裁剪后的图片,这里将其设置到imageview中 case CUT_OK: /** * 非空判断大家一定要验证,如果不验证的话, 在剪裁之后如果发现不满意, * 要重新裁剪,丢弃 当前功能时,会报NullException */ if (data != null) { try { // Bitmap bm = BitmapFactory.decodeStream(getContentResolver().openInputStream(data.getData())); // i1.setImageBitmap(bitmap); Bitmap bm = BitmapFactory.decodeFile(bitfile.getAbsolutePath());//这里获取了Bitmap,就可以进行显示操作,而一般上传去网上,可以使用文件路径bitfile.getAbsolutePath(),// 这不推荐用data进行数据操作,特别因为华为手机方法与其他手机不一致,容易bug。 mRoundImageView2.setImageBitmap(bm); Qiuutil.LogE(Uri.fromFile(bitfile) + ":" + bitfile.getAbsolutePath()); } catch (Exception ex) { ex.printStackTrace(); } } else { Log.e("图片数据获取Main", "data为空"); } break; default: break; } super.onActivityResult(requestCode, resultCode, data);}调用时:
mTextView2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //xiangji(); xiangce(); }});
新闻热点
疑难解答