【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();
        }
    }





上一篇:oracle、sqlserver、mysql常用函数对比[to_char、to_number、to_date]


下一篇:如何授权一个子账号管理某个redis实例