美文网首页
Android选择手机本地图片

Android选择手机本地图片

作者: 方_f666 | 来源:发表于2021-05-22 10:47 被阅读0次

上传头像、上传图片是都会时候用到获取手机本地图片文件。下面几种方式实现这个功能。
第一种:Intent跳转

                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_PICK);
                intent.setType("image/*");
                startActivityForResult(intent, 0x01);

展示选择到的图片

  @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 0x01) {
            // 选择到图片的uri
            Uri uri = data.getData();

            // 第一种方式,使用文件路径创建图片
            // 文件路径的列
            String[] filePathColumn = {MediaStore.Images.Media.DATA};
            // 获取图片的游标
            Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
            cursor.moveToFirst();
            // 获取列的指针
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            // 根据指针获取图片路径
            String picturePath = cursor.getString(columnIndex);
            cursor.close();
            // 使用地址获取图片
            Bitmap bitmap = BitmapFactory.decodeFile(picturePath);
            mIvPath.setImageBitmap(bitmap);

            // 第二种方式
            Bitmap bitmapStream = null;
            try {
                // 使用流获取图片
                bitmapStream = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            mIvStream.setImageBitmap(bitmapStream);
        }
    }

第一种:getLoaderManager()获取图片资源

        LoaderManager loaderManager = getLoaderManager();
        loaderManager.initLoader(0x01, null, new LoaderManager.LoaderCallbacks<Cursor>() {
            final String[] PROJECTION = new String[]{
                    MediaStore.Images.Media._ID, // Id
                    MediaStore.Images.Media.DATA, // 图片路径
                    MediaStore.Images.Media.DATE_ADDED // 图片的创建时间
            };
            @Override
            public Loader<Cursor> onCreateLoader(int id, Bundle args) {
                // 创建一个Loader
                if (id == LOADER_ID) {
                    // 如果是我们的ID则可以进行初始化
                    return new CursorLoader(PickPictureActivity.this,
                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, // 选择资源
                            PROJECTION, // 选择要查询的列
                            null,
                            null,
                            null); // 倒叙或升序
                }
                return null;
            }

            @Override
            public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
                // 当Loader加载完成时
                List<Image> images = new ArrayList<>();
                // 判断是否有数据
                if (data != null) {
                    int count = data.getCount();
                    if (count > 0) {
                        // 移动游标到开始
                        data.moveToFirst();
                        // 得到对应的列的Index坐标
                        int indexId = data.getColumnIndexOrThrow(PROJECTION()[0]);
                        int indexPath = data.getColumnIndexOrThrow(PROJECTION()[1]);
                        int indexDate = data.getColumnIndexOrThrow(PROJECTION()[2]);
                        do {
                            // 循环读取,直到没有下一条数据
                            int id = data.getInt(indexId);
                            String path = data.getString(indexPath);
                            long dateTime = data.getLong(indexDate);

                            File file = new File(path);
                            if (!file.exists() || file.length() < 9) {
                                // 如果没有图片,或者图片大小太小,则跳过
                                continue;
                            }
                            // 添加一条新的数据
                            Image image = new Image();
                            image.id = id;
                            image.path = path;
                            image.date = dateTime;
                            images.add(image);
                        } while (data.moveToNext());
                    }
                }
                // images是获取到的图片列表,可用用于展示UI
            }
        

            @Override
            public void onLoaderReset(Loader<Cursor> loader) {
                // 当Loader销毁或者重置了, 进行界面清空
            }
        });

完整代码:

相关文章

网友评论

      本文标题:Android选择手机本地图片

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