文章目录
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(); } }