【OkHttp】OkHttp 上传图片 ( 获取 SD 卡动态权限 | 跳转到相册界面选择图片 | 使用 OkHttp 上传图片文件 )(一)

简介: 【OkHttp】OkHttp 上传图片 ( 获取 SD 卡动态权限 | 跳转到相册界面选择图片 | 使用 OkHttp 上传图片文件 )(一)

文章目录

OkHttp 系列文章目录

前言

一、获取 SD 卡动态权限

二、跳转到相册界面

三、选择完相册图片后回到本界面

四、使用 OkHttp 上传图片文件 ( 核心步骤 )

五、完整代码示例

六、博客资源

前言

在上一篇博客 【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 ) 中介绍了 OkHttp 的 同步 / 异步 的 Get / Post 请求 , 本篇博客开始讲解文件的上传 ;






一、获取 SD 卡动态权限


在清单文件中 , 注册如下权限 ;


 

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


在 Activity 中 , 动态申请权限 , 这里使用到了一个动态权限库 ;


此处也可以使用原生代码自己开发动态权限申请 【Android 应用开发】动态权限管理示例 ( 使用原生代码实现 | 申请权限 | 判定权限申请结果 | 判定 “ 不再询问 “ 情况 ) ,


也可以使用 Google 官方的 EasyPermission 权限框架 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 完整代码示例 | 申请权限 | 申请权限原理对话框 | 引导用户手动设置权限对话框 ) ;


   

// 申请权限
        AndPermission.with(this)
                .runtime()
                .permission(
                        // 申请 SD 卡权限
                        Permission.WRITE_EXTERNAL_STORAGE,
                        Permission.READ_EXTERNAL_STORAGE
                ).onGranted(new Action<List<String>>() {
                    @Override
                    public void onAction(List<String> data) {
                        // 所有权限都通过
                    }
                }).onDenied(new Action<List<String>>() {
                    @Override
                    public void onAction(List<String> data) {
                        // 存在至少 1 个权限被拒绝
                    }
                }).start();



二、跳转到相册界面


使用下面的 Intent 设置 , 跳转到相册图片选择界面 ;


// 跳转到相册界面
Intent intent = new Intent(
        Intent.ACTION_PICK,
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_CODE);






三、选择完相册图片后回到本界面


① 首先 , 判定是否获取成功 , 如果图片获取成功 , 再向下继续执行 ;


   

//获取图片路径
        if (requestCode == REQUEST_CODE
                && resultCode == Activity.RESULT_OK
                && data != null) {


② 其次 , 获取图像的 Uri , 这是查找图片的唯一依据 ;


// 获取图像 Uri
Uri imageUri = data.getData();



③ 再次 , 查询数据库中 , Uri 对应图片的文件路径 ; 文件路径所在的字段是 MediaStore.Images.Media.DATA 字段 , 列明为 _data ;


// 要查询的列字段名称
String[] filePathColumns = {MediaStore.Images.Media.DATA};
// 到数据库中查询 , 查询 _data 列字段信息
Cursor cursor = getContentResolver().query(
        imageUri,
        filePathColumns,
        null,
        null,
        null);
cursor.moveToFirst();
// 获取 _data 列所在的列索引
int columnIndex = cursor.getColumnIndex(filePathColumns[0]);
// 获取图片的存储路径
String filePath = cursor.getString(columnIndex);
// 获取数据完毕后, 关闭游标
cursor.close();



④ 最后 , 使用 OkHttp 上传获取的图片对应的文件路径 ;



完整代码示例 :


 

/**
     * 在相册中选择图片返回
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //获取图片路径
        if (requestCode == REQUEST_CODE
                && resultCode == Activity.RESULT_OK
                && data != null) {
            // 获取图像 Uri
            Uri imageUri = data.getData();
            // 要查询的列字段名称
            String[] filePathColumns = {MediaStore.Images.Media.DATA};
            // 到数据库中查询 , 查询 _data 列字段信息
            Cursor cursor = getContentResolver().query(
                    imageUri,
                    filePathColumns,
                    null,
                    null,
                    null);
            cursor.moveToFirst();
            // 获取 _data 列所在的列索引
            int columnIndex = cursor.getColumnIndex(filePathColumns[0]);
            // 获取图片的存储路径
            String filePath = cursor.getString(columnIndex);
            // 使用 OkHttp 上传图片
            upload(filePath);
            // 获取数据完毕后, 关闭游标
            cursor.close();
        }
    }





目录
相关文章
|
4月前
|
XML Java Android开发
Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)
Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)
142 0
|
8月前
针对FastAdmin新增上传多个图片,新增上传的视频的预览效果
针对FastAdmin新增上传多个图片,新增上传的视频的预览效果
387 0
|
9月前
微信录音上传至七牛云控制器代码
微信录音上传至七牛云控制器代码
59 0
|
7月前
|
小程序 JavaScript
微信小程序配置上传多个u-upload上传
使用的是uView框架 微信小程序配置上传多个u-upload上传图片 场景需求:根据PC端配置项追加图片配置 小程序根据配置的图片数量,图片名称,进行上传图片 难度在于 我们不知道用户会追加多少个图片配置字段
92 0
|
8月前
uniapp上传图片的回显
uniapp上传图片的回显
221 0
从后台获取图片流(验证码)加载多次问题
从后台获取图片流(验证码)加载多次问题
从后台获取图片流(验证码)加载多次问题
|
小程序 Java
微信小程序之JAVA后台上传图片,并且返回图片路径
微信小程序之JAVA后台上传图片,并且返回图片路径
491 0
|
缓存
封装一下图片下载功能
封装一下图片下载功能
77 0
封装一下图片下载功能
|
前端开发
使用SpringMvc跨服务器上传图片,Ajax异步刷新图片框显示图片功能请求不到后台,onChange事件没有激活的源码?
使用SpringMvc跨服务器上传图片,Ajax异步刷新图片框显示图片功能请求不到后台,onChange事件没有激活的源码?
81 0
使用SpringMvc跨服务器上传图片,Ajax异步刷新图片框显示图片功能请求不到后台,onChange事件没有激活的源码?
|
存储 Web App开发 前端开发
移动端图片操作(一)——上传
上传我们一般都是用“input[type=file]”控件。当你用此控件时,你就授权了网页和服务器访问对应的文件,就可以得到File对象。
移动端图片操作(一)——上传