美文网首页
安卓中调用相册

安卓中调用相册

作者: 今天也要努力呀y | 来源:发表于2019-07-23 20:53 被阅读0次

    说实话调用相册我觉得是一件很麻烦的事情,但是在总结完了之后发现也不过如此,就复制代码就完了
    添加几个依赖(其中第三行我添加的是圆形图标的依赖如果你不用就不用加)

    implementation 'com.github.bumptech.glide:glide:4.8.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
    api 'de.hdodenhof:circleimageview:2.2.0'
    implementation 'com.zhihu.android:matisse:0.4.3'
    implementation 'pub.devrel:easypermissions:1.2.0'
    

    然后当前活动implement一下

    EasyPermissions.PermissionCallbacks
    

    一般你们用的是ImageView,我这里头像用的是圆形头像,不用圆形头像的改成ImageView就行了

     private CircleImageView circleImageView;
        private String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
        String photoPath = null;
    
     case R.id.circle_image:
                    //调用相册
                    getPermission();
                    goPhotoAlbum();
                    break;
    

    点击事件别忘了

    circleImageView.setOnClickListener(this);
    
    private void goPhotoAlbum() {
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(intent, 2);
        }
    private void getPermission() {
            if (EasyPermissions.hasPermissions(this, permissions)) {
                //已经打开权限
                Toast.makeText(this, "已经申请相关权限", Toast.LENGTH_SHORT).show();
            } else {
                //没有打开相关权限、申请权限
                EasyPermissions.requestPermissions(this, "需要获取您的相册权限", 1, permissions);
            }
    
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            //框架要求必须这么写
            EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
        }
    
        @Override
        public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
    
        }
    
        @Override
        public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
    
        }
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == 2 && resultCode == RESULT_OK) {
                photoPath = getPhotoFromPhotoAlbum.getRealPathFromUri(this, data.getData());
                Glide.with(AddStudent.this).load(photoPath).into(circleImageView);
            }
    
            super.onActivityResult(requestCode, resultCode, data);
        }
    

    这里还有一个将uri地址转换为绝对地址的工具类

    public class getPhotoFromPhotoAlbum {
        /**
         * 根据Uri获取图片的绝对路径
         *
         * @param context 上下文对象
         * @param uri     图片的Uri
         * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
         */
        public static String getRealPathFromUri(Context context, Uri uri) {
            int sdkVersion = Build.VERSION.SDK_INT;
            if (sdkVersion >= 19) {
                return getRealPathFromUriAboveApi19(context, uri);
            } else {
                return getRealPathFromUriBelowAPI19(context, uri);
            }
        }
    
        /**
         * 适配api19以下(不包括api19),根据uri获取图片的绝对路径
         *
         * @param context 上下文对象
         * @param uri     图片的Uri
         * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
         */
        private static String getRealPathFromUriBelowAPI19(Context context, Uri uri) {
            return getDataColumn(context, uri, null, null);
        }
    
        /**
         * 适配api19及以上,根据uri获取图片的绝对路径
         *
         * @param context 上下文对象
         * @param uri     图片的Uri
         * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
         */
        @SuppressLint("NewApi")
        private static String getRealPathFromUriAboveApi19(Context context, Uri uri) {
            String filePath = null;
            if (DocumentsContract.isDocumentUri(context, uri)) {
                // 如果是document类型的 uri, 则通过document id来进行处理
                String documentId = DocumentsContract.getDocumentId(uri);
                if (isMediaDocument(uri)) {
                    // 使用':'分割
                    String id = documentId.split(":")[1];
    
                    String selection = MediaStore.Images.Media._ID + "=?";
                    String[] selectionArgs = {id};
                    filePath = getDataColumn(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);
                } else if (isDownloadsDocument(uri)) {
                    Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));
                    filePath = getDataColumn(context, contentUri, null, null);
                }
            } else if ("content".equalsIgnoreCase(uri.getScheme())) {
                // 如果是 content 类型的 Uri
                filePath = getDataColumn(context, uri, null, null);
            } else if ("file".equals(uri.getScheme())) {
                // 如果是 file 类型的 Uri,直接获取图片对应的路径
                filePath = uri.getPath();
            }
            return filePath;
        }
    
        /**
         * 获取数据库表中的 _data 列,即返回Uri对应的文件路径
         *
         */
        private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
            String path = null;
    
            String[] projection = new String[]{MediaStore.Images.Media.DATA};
            Cursor cursor = null;
            try {
                cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
                if (cursor != null && cursor.moveToFirst()) {
                    int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);
                    path = cursor.getString(columnIndex);
                }
            } catch (Exception e) {
                if (cursor != null) {
                    cursor.close();
                }
            }
            return path;
        }
    
        /**
         * @param uri the Uri to check
         * @return Whether the Uri authority is MediaProvider
         */
        private static boolean isMediaDocument(Uri uri) {
            return "com.android.providers.media.documents".equals(uri.getAuthority());
        }
    
        /**
         * @param uri the Uri to check
         * @return Whether the Uri authority is DownloadsProvider
         */
        private static boolean isDownloadsDocument(Uri uri) {
            return "com.android.providers.downloads.documents".equals(uri.getAuthority());
        }
    }
    

    最后还需要一个xml文件是path的,这个xml文件必须先在res之下新建一个xml包,然后放进去代码

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
       <external-path name="external_files" path="."/>
    </paths>
    

    大功告成,代码复制就完事了

    相关文章

      网友评论

          本文标题:安卓中调用相册

          本文链接:https://www.haomeiwen.com/subject/agqzlctx.html