【Android】记录一次安卓10的图片读取
2022-01-29 18:53
3787 查看
【Android】记录一次安卓10的图片读取
非常的难受,这个读写内容。因为Android 10没有读取sd的权限了,Android 11都恢复了部分读写权限,但是Android 10的适配是真的难受。
好在有
内容提供者这个组件,通过这个中介可以获取Uri,再从Uri转为InputSteam,之后转为byte[]
从Uri到InputSteam再到byte[]
在学okhttp post上传图片文件的时候,因为读取不了文件,所以File对象无法生成,导致
RequestBody fileBody = RequestBody.create(mediaType,content);方法中,content无法成为file对象,如何解决上传图片的问题?
查看create方法的传参:
发现可以用byte[]数组进行上传,ok那就换一种方式——
从Uri到InputSteam到byte[]
我编写了一个工具类,其中的方法可以看看注释:
import ...; public class QStorageUtils { // 从图片路径转为Uri public static Uri imagePath2Uri(Context context, String path) { Cursor cursor = null; try { cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=? ", new String[]{path}, null); if (cursor != null && cursor.moveToFirst()) { @SuppressLint("Range") int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID)); Uri baseUri = Uri.parse("content://media/external/images/media"); return Uri.withAppendedPath(baseUri, "" + id); } else { // 如果图片不在手机的共享图片数据库,就先把它插入。 if (new File(path).exists()) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, path); return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } else { return null; } } } catch (Exception e) { e.printStackTrace(); } finally { closeSteam(cursor); } return null; } // Uri转为Bytes数组 public static byte[] Uri2Bytes(Context context, Uri uri) { InputStream is = null; ByteArrayOutputStream baos = null; try { baos = new ByteArrayOutputStream(); is = context.getContentResolver().openInputStream(uri); byte[] buf = new byte[1024]; int len = 0; String content = null; while ((len=is.read(buf)) != -1) { baos.write(buf,0,len); } return baos.toByteArray(); } catch (Exception e) { e.printStackTrace(); } finally { closeSteam(is); closeSteam(baos); } return new byte[0]; } // 关闭流 public static void closeSteam(Closeable stream) { try { if (stream != null) { stream.close(); } } catch (IOException e) { e.printStackTrace(); } } }
okhttp使用post上传文件的方法如下:
@SuppressLint("Range") private void btnDoUploadFile() { OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10000,TimeUnit.MILLISECONDS) .build(); Uri imageContentUri = QStorageUtils.imagePath2Uri(this, "/storage/emulated/0/Download/1195405.jpg"); Log.d(TAG,"pic uri --> " + imageContentUri); byte[] content = QStorageUtils.Uri2Bytes(this,imageContentUri); MediaType mediaType = MediaType.parse("image/jpeg"); RequestBody fileBody = RequestBody.create(mediaType,content); RequestBody requestBody = new MultipartBody.Builder() .addFormDataPart("file","1.jpg",fileBody) .build(); Request request = new Request.Builder() .url(BASE_URL + "file/upload") .post(requestBody) .build(); Call task = client.newCall(request); task.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.d(TAG,"onFailure --> " + e.toString()); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { Log.d(TAG,"response code --> " + response.code()); ResponseBody body = response.body(); assert body != null; Log.d(TAG,"response body --> " + body.string()); } } }); }
测试上传成功:
相关文章推荐
- Android 10获取动态权限(读取本地图片)
- Android 安卓10.0无法保存图片,无法读取手机图片并显示解决方法!!!
- Android学习记录(10)—Android之图片颜色处理
- Android学习记录(10)—Android之图片颜色处理
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- Unity安卓Android与iOS保存图片并显示在相册
- Android自定义动态布局 — 多图片上传(记录一下,以后可能会用到)
- Android ViewPager中显示图片与播放视频的填坑记录
- 记一次小白之路使用AndroidViewAnimations 安卓抖动动画
- Android学习篇章10-Matrix图片放大缩小
- android ui 读取外部设备scdard的图片设置程序背景
- android读取大图片并缓存
- android怎么读取项目中的图片或文件目录分析
- android 用LruCache读取大图片并缓存(转)
- Android优化:Android 用LruCache读取大图片并缓存
- android学习记录(二)-----imageView实现图片的旋转和缩放
- 记录Android国际化图片资源的一个坑
- android 拍照的照片方向问题,读取图片EXIF信息
- 关于安卓(Android)图片上传大图的两点建议。
- Androidr的图片的缩放、读取、压缩保存