需求:app需要一个功能,选择本地图片或拍照上传服务器作为头像,此示例只能选择一张图片。
实现:
1.选择本地图片:
方式一:
//跳转相册
val intent = Intent(Intent.ACTION_PICK)
intent.type = "image/*"
startActivityForResult(intent, TAKE_PIC_LOCAL)
如下图所示,跳转至选择照片页面:
进入任一文件夹,选择任一照片,处理返回值:
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
when (requestCode) {
TAKE_PIC_LOCAL -> {
mPopWindow!!.dismiss()
val uri: Uri? = resultData!!.data
if (null !== uri) {
mUploading_pic_iv!!.setImageURI(uri)
}
}
}
方式二:
val intent = Intent()
intent.setAction(Intent.ACTION_GET_CONTENT);//ACTION_OPEN_DOCUMENT
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
intent.putExtra("return-data", true);
intent.putExtra("crop", "true");
//设置宽高比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//设置裁剪图片宽高、
intent.putExtra("outputX", 450);
intent.putExtra("outputY", 450);
startActivityForResult(intent, TAKE_PIC_LOCAL);
获取返回结果:
val uri: Uri? = resultData!!.data
if (null !== uri) {
mUploading_pic_iv!!.setImageURI(uri)
}
2.拍照,上传图片
方式一:
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
//可以直接在这里设置保存拍摄的照片到手机
startActivityForResult(intent, TAKE_PIC_NEW)
//跳转界面传回拍照所得数据
处理拍照后的数据:
此处需要保存bitmap,但是我没有保存
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
val photo1 = resultData!!.getParcelableExtra<Bitmap>("data")
mUploading_pic_iv!!.setImageBitmap(photo1)
}
方式二:
需要先验证用户有没有允许使用相机的权限:
val Application = activity.application as MyApplication
if (Application.CheckPermission("android.permission.CAMERA")) {
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
if (intent.resolveActivity(context.getPackageManager()) !== null) {
photoFile = File.createTempFile(GenerateFileName("JPG"), ".jpg",
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM))//新拍摄的照片存储在这里
if (null !== photoFile) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile))//指定图片的输出地址
}
}
startActivityForResult(intent, TAKE_PIC_NEW)//,启动照相机,跳转界面传回拍照所得数据
} else {
Toast.makeText(context, "请打开权限!", Toast.LENGTH_LONG).show()
}
当返回结果后,将照片对应的uri解析为Bitmap
//图片uri解析成Bitmap对象
var bitmap = BitmapFactory.decodeStream(context.contentResolver.openInputStream(Uri.fromFile(photoFile)))
mUploading_pic_iv!!.setImageBitmap(bitmap)