//需要的权限数组 读/写/相机
private static String[] PERMISSIONS_STORAGE = {android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};// 头像
private ImageView imageView;
private String imgUrl;// 初始化时,绑定控件
imageView = findViewById(R.id.imageView);// 点击事件,底部弹出框
ActionSheetDialog dialog = new ActionSheetDialog(getActivity()).builder().setCancelable(false).setTitle("请选择").addSheetItem("相册", null, which -> {//选择照片按钮Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(intent, 100);}).addSheetItem("拍照", null, which -> {//检查是否已经获得相机的权限if (verifyPermissions(getActivity(), PERMISSIONS_STORAGE[2]) == 0) {Log.e("", "提示是否要授权");ActivityCompat.requestPermissions(getActivity(), PERMISSIONS_STORAGE, 3);} else if (verifyPermissions(getActivity(), PERMISSIONS_STORAGE[1]) == 0) {Log.e("", "提示是否要授权");ActivityCompat.requestPermissions(getActivity(), PERMISSIONS_STORAGE, 3);} else if (verifyPermissions(getActivity(), PERMISSIONS_STORAGE[0]) == 0) {Log.e("", "提示是否要授权");ActivityCompat.requestPermissions(getActivity(), PERMISSIONS_STORAGE, 3);} else {//已经有权限,打开相机Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent2, 200);}});dialog.show();/*** 检查是否有对应权限** @param activity   上下文* @param permission 要检查的权限* @return 结果标识*/public int verifyPermissions(Activity activity, java.lang.String permission) {int Permission = ActivityCompat.checkSelfPermission(activity, permission);if (Permission == PackageManager.PERMISSION_GRANTED) {Log.e("", "已经同意权限");return 1;} else {Log.e("", "没有同意权限");return 0;}}@RequiresApi(api = Build.VERSION_CODES.KITKAT)@Overridepublic void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == 100 && resultCode == RESULT_OK && data != null) {//系统相册Uri imageData = data.getData();String path = getPath(imageData);Bitmap bitmap = BitmapFactory.decodeFile(path);Bitmap bitmap1 = BitmapUtils.zoomBitmap(bitmap, imageView.getWidth(),imageView.getHeight());Bitmap bitmap2 = BitmapUtils.createCircleBitmap(bitmap1, 0, false, 0, 0);//加载显示imageView.setImageBitmap(bitmap2);// bitmap图片上传到服务器(写你自己的上传方法)// bitmap图片保存到本地saveImage(bitmap2);} else if (requestCode == 200 && resultCode == RESULT_OK && data != null) {//系统相机Bitmap photo = null;Uri uri = data.getData();if (uri != null) {photo = BitmapFactory.decodeFile(uri.getPath());}if (photo == null) {Bundle bundle = data.getExtras();if (bundle != null) {photo = (Bitmap) bundle.get("data");} else {
//                    Tools.toast(Tools.getResString(R.string.LAN299));return;}}FileOutputStream fileOutputStream = null;try {// 获取 SD 卡根目录String saveDir = context.getExternalFilesDir(null).getAbsolutePath() + "/meitian_photos";// 新建目录File dir = new File(saveDir);if (!dir.exists()) dir.mkdir();// 生成文件名SimpleDateFormat t = new SimpleDateFormat("yyyyMMddssSSS");String filename = "MT" + (t.format(new Date())) + ".jpg";// 新建文件File file = new File(saveDir, filename);// 打开文件输出流fileOutputStream = new FileOutputStream(file);// 生成图片文件photo.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);// 相片的完整路径imgUrl = file.getPath();Log.i("相册完整路径", imgUrl);} catch (Exception e) {e.printStackTrace();} finally {if (fileOutputStream != null) {try {fileOutputStream.close();} catch (Exception e) {e.printStackTrace();}}}// bitmap图片上传到服务器(写你自己的上传方法)// bitmap图片保存到本地saveImage(photo);}}private void saveImage(Bitmap bitmap) {File filesDir;if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判断sd卡是否挂载//路径1:storage/sdcard/Android/data/包名/filesfilesDir = getActivity().getExternalFilesDir("");} else {//手机内部存储//路径:data/data/包名/filesfilesDir = getActivity().getFilesDir();}FileOutputStream fos = null;try {File file = new File(filesDir, "icon.png");fos = new FileOutputStream(file);bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}//如果本地有,就不需要再去联网去请求private boolean readImage() {File filesDir;if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // 判断sd卡是否挂载//路径1:storage/sdcard/Android/data/包名/filesfilesDir = getActivity().getExternalFilesDir("");} else {//手机内部存储//路径:data/data/包名/filesfilesDir = getActivity().getFilesDir();}File file = new File(filesDir, "icon.png");if (file.exists()) {//存储--->内存Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());imageView.setImageBitmap(bitmap);return true;}return false;}@RequiresApi(api = Build.VERSION_CODES.KITKAT)private String getPath(Uri uri) {int sdkVersion = Build.VERSION.SDK_INT;//高于4.4.2的版本if (sdkVersion >= 19) {Log.e("TAG", "uri auth: " + uri.getAuthority());if (isExternalStorageDocument(uri)) {String docId = DocumentsContract.getDocumentId(uri);String[] split = docId.split(":");String type = split[0];if ("primary".equalsIgnoreCase(type)) {return Environment.getExternalStorageDirectory() + "/" + split[1];}} else if (isDownloadsDocument(uri)) {final String id = DocumentsContract.getDocumentId(uri);final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(id));return getDataColumn(getActivity(), contentUri, null, null);} else if (isMediaDocument(uri)) {final String docId = DocumentsContract.getDocumentId(uri);final String[] split = docId.split(":");final String type = split[0];Uri contentUri = null;if ("image".equals(type)) {contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;} else if ("video".equals(type)) {contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;} else if ("audio".equals(type)) {contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;}final String selection = "_id=?";final String[] selectionArgs = new String[]{split[1]};return getDataColumn(getActivity(), contentUri, selection, selectionArgs);} else if (isMedia(uri)) {String[] proj = {MediaStore.Images.Media.DATA};Cursor actualimagecursor = getActivity().managedQuery(uri, proj, null, null, null);int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);actualimagecursor.moveToFirst();return actualimagecursor.getString(actual_image_column_index);}} else if ("content".equalsIgnoreCase(uri.getScheme())) {// Return the remote addressif (isGooglePhotosUri(uri))return uri.getLastPathSegment();return getDataColumn(getActivity(), uri, null, null);}// Fileelse if ("file".equalsIgnoreCase(uri.getScheme())) {return uri.getPath();}return null;}/*** uri路径查询字段** @param context* @param uri* @param selection* @param selectionArgs* @return*/public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {Cursor cursor = null;final String column = "_data";final String[] projection = {column};try {cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);if (cursor != null && cursor.moveToFirst()) {final int index = cursor.getColumnIndexOrThrow(column);return cursor.getString(index);}} finally {if (cursor != null)cursor.close();}return null;}private boolean isExternalStorageDocument(Uri uri) {return "com.android.externalstorage.documents".equals(uri.getAuthority());}public static boolean isDownloadsDocument(Uri uri) {return "com.android.providers.downloads.documents".equals(uri.getAuthority());}public static boolean isMediaDocument(Uri uri) {return "com.android.providers.media.documents".equals(uri.getAuthority());}public static boolean isMedia(Uri uri) {return "media".equals(uri.getAuthority());}/*** @param uri The Uri to check.* @return Whether the Uri authority is Google Photos.*/public static boolean isGooglePhotosUri(Uri uri) {return "com.google.android.apps.photos.content".equals(uri.getAuthority());}

兼容Android11的手机拍照上传图片和相册选择图片功能(可直接用)相关推荐

  1. 移动端h5实现手机拍照上传图片,相册选择上传图片input type=file

    移动端h5实现手机拍照上传图片,相册选择上传图片input type=file 有不足或者不对的在下方留言,有不明白的也请在下方留言,虽然我不一定能看到,话不多说上代码,注释都写好了 <!doc ...

  2. iOS上传头像, 相册权限,相册权限,拍照上传,相册选择图片,拍照页面语言设置,保存到相册...

    2019独角兽企业重金招聘Python工程师标准>>> 1. 权限 在打开相机拍照或者打开相册选择图片之前, 有必要先判断先是否有权限, 如果没有权限应该给个提示, 让用户自己去设置 ...

  3. Android拍照及从相册选择图片传详解(终极版)

    Android 拍照及从相册选择图片传详解 先上图 新知识点速览 URI(统一资源标识符)是标识逻辑或物理资源的字符序列,与URL类似,也是一串字符.通过使用位置,名称或两者来标识Internet上的 ...

  4. Android 拍照、从相册选择图片

    在做Android图片上传功能的时候,获取图片的途径一般都有两种:拍照.从相册选择. 一.拍照 调用相机拍照有两种方法: 直接返回图片. 在调用相机的时候,传入uri,拍照后通过该uri来获取图片. ...

  5. Android10(华为Mate30)获取图片路径失败,拍照或从相册选择图片后无法显示

    在使用华为Mate30是从图库选择图片,本地无法显示,其他手机没问题,发现是兼容Android10的问题,Android10下本app的私有文件是不需要权限的,访问其他应用权限需要权限 android ...

  6. pictureselector 压缩_Android 拍照、从相册选择图片之PictureSelector

    仿微信实现在Android平台下的图片选择器,支持从相册获取图片.视频.音频&拍照,支持裁剪(单图or多图裁剪).压缩.主题自定义配置等功能,支持动态获取权限&适配Android 5. ...

  7. 微信小程序 — 打开相册选择图片功能

    点击页面的相册按钮如何打开系统相册.选择图片: <text class="nav-item1" bindtap="navToalbum">相册< ...

  8. MUI 拍照和从系统相册选择图片上传

    要完成用MUI 拍照和从系统相册选择图片上传的功能,可以理解成有三个功能 1 调用手机相机的功能(可以查看官方API  http://www.html5plus.org/doc/zh_cn/camer ...

  9. 关于小米手机从系统相册选择图片的一个bug

    在开发应用的时候碰到一个问题,拍照或者从系统相册选择图片并上传,首先从相机或者相册获取图片并压缩处理,最后再上传,代码写好并基本测试通过,然而深度测试的时候却发现有一个问题. 在小米手机,即MIUI系 ...

最新文章

  1. Vue 里的$如何理解
  2. myeclipse自动生成hibernate映射文件的过程
  3. python辗转相除法求最大公约数的递归函数_Python基于辗转相除法求解最大公约数的方法示例...
  4. __init__函数
  5. JDEManual2 Overview
  6. linux文件系统管理实践题目,Linux软件管理、文件系统管理实践
  7. 关于Android工程师转vue的三两事儿(10)--原型与原型链
  8. 2021,Java最全的分布式面试题合集附答案,共2w字!
  9. 三、解线性方程组的迭代法
  10. python2最新版本_Python 2.7.18发布,Python 2的最新版本
  11. WINDOWS如何编写注册表文件
  12. wireshark分析ICMP数据包
  13. 计算机怎么屏幕保护,屏保设置在哪里设置 电脑屏保怎么设置
  14. EMBER-网络安全恶意软件公开数据集,论文的翻译,自己的笔记
  15. 数仓建模—建模工具PdMan
  16. maven 汉字转拼音
  17. abp vnext 通过Claim扩展用户表字段
  18. android 移动拼图效果实现
  19. 高通骁龙875夺安卓处理器桂冠,但外挂5G基带成为它的弊病
  20. 用树莓派学Linux(三)--------SSH端口转发,跳出局域网的树莓派控制

热门文章

  1. 正确选择餐具,健康美好生活
  2. pyscripter与python的关系_我用过的最好的python编辑器PyScripter
  3. 一种基于陀螺仪传感器的准确计步器算法
  4. 八皇后问题的进化(4)-python写的八皇后
  5. 公务员面试题:领导干部直播带货,你怎么看?
  6. PTN/IPRAN技术介绍及发展史
  7. 浅析国内指纹识别技术(附带小工具)
  8. win10注册ocx控件的步骤(包含错误处理方法0x80040200)
  9. win10下注册MSCOMM32控件
  10. 解决微信“聊天界面中的新消息通知”设置按钮不见了问题