很多地方都会用到上传图片,然而上传图片的第一步就是选择图片,我们不可能让用户自己设置图片的路径,所以这时候就需要一个可视化的操作界面。
我们选用系统自带的图片选择器或者是拍照:
private static final File PHOTO_DIR = new File(Untils.getSdPathStr() + "/photo/");// 要保存图片的文件夹 private File tempFile;// 拍照获得的文件 private Uri tempuri; private String temppath; /* 用来标识请求照相功能 */ private static final int CAMERA_WITH_DATA = 10010; /* 用来标识请求gallery */ private static final int PHOTO_PICKED_WITH_DATA = 10086;
然后写调起图片选择器的方法:
public void takePhoto() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // Log.e("asdfggh", "没有获取到拍照权限"); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1); } else { // Log.e("asdfggh", "Android版本号小于23,直接进行拍照"); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 下面这句指定调用相机拍照后的照片存储的路径 if (!PHOTO_DIR.exists()) { PHOTO_DIR.mkdirs();// 创建照片的存储目录 } tempFile = new File(PHOTO_DIR, getPhotoFileName());// 创建文件老保存图片 temppath = tempFile.getAbsolutePath(); tempuri = Uri.fromFile(tempFile); intent.putExtra(MediaStore.EXTRA_OUTPUT, tempuri); startActivityForResult(intent, CAMERA_WITH_DATA); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // Log.e("asdfggh", "动态获取权限的返回值:requestCode:" + requestCode); if (requestCode == 1) { // Log.e("asdfggh", "动态获取权限的返回值:grantResults[0]:" + grantResults[0]); if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { //权限获取成功 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 下面这句指定调用相机拍照后的照片存储的路径 if (!PHOTO_DIR.exists()) { PHOTO_DIR.mkdirs();// 创建照片的 存储目录 } tempFile = new File(PHOTO_DIR, getPhotoFileName());// 创建文件老保存图片 temppath = tempFile.getAbsolutePath(); tempuri = Uri.fromFile(tempFile); intent.putExtra(MediaStore.EXTRA_OUTPUT, tempuri); startActivityForResult(intent, CAMERA_WITH_DATA); } else { //权限被拒绝 Toast.makeText(this, "获取拍照权限失败!", Toast.LENGTH_SHORT).show(); } } } // 用手机中保存的图片 private void pickPhoto() { if (!PHOTO_DIR.exists()) { PHOTO_DIR.mkdirs();// 创建照片的存储目录 } Intent intent = new Intent(Intent.ACTION_PICK, null); /** * 下面这句话,与其它方式写是一样的效果,如果: intent.setData(MediaStore.Images * .Media.EXTERNAL_CONTENT_URI); intent.setType(""image/*");设置数据类型 * 如果朋友们要限制上传到服务器的图片类型时可以直接写如 :"image/jpeg 、 image/png等的类型" */ intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(intent, PHOTO_PICKED_WITH_DATA); } //处理startActivityForResult方法的监听 protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { // 如果是直接从相册获取 case PHOTO_PICKED_WITH_DATA: if (data != null && data.getData() != null) { String getdata = data.getData().toString(); String photopath = getdata.substring(8, getdata.length()); sendFile(photopath); } break; // 如果是调用相机拍照时 case CAMERA_WITH_DATA: if (resultCode == 0) { return; } String photopath = tempuri.getPath(); ll_filechoose.setVisibility(View.GONE); sendFile(photopath); break; default: break; } super.onActivityResult(requestCode, resultCode, data); }
// 使用系统当前日期加以调整作为照片的名称 private String getPhotoFileName() { Date date = new Date(System.currentTimeMillis()); SimpleDateFormat dateFormat = new SimpleDateFormat("'IMG'_yyyyMMdd_HHmmss"); return dateFormat.format(date) + ".jpg"; }
代码就是这样。