Android应用在小米手机触发FileNotFoundException,其他手机正常
我最近折腾出了一个简易的图片小工具,功能很直白:在主页面打开相册选一堆图片,把它们的URI存进列表;再跳转到另一个页面,从列表里拿URI生成对应的缩略图。下面是核心步骤的代码实现,给大家参考:
主Activity:多选图片并存储URI列表
首先得启动支持多选的相册Intent,然后在回调里处理选中的图片:
// 定义请求码 private static final int PICK_IMAGE_REQUEST = 1001; // 启动相册多选 private void openMultiImagePicker() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); startActivityForResult(intent, PICK_IMAGE_REQUEST); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK) { List<String> imageUriStringList = new ArrayList<>(); // 处理多选场景 if (data.getClipData() != null) { int selectedCount = data.getClipData().getItemCount(); for (int i = 0; i < selectedCount; i++) { Uri imageUri = data.getClipData().getItemAt(i).getUri(); // 把URI转成字符串存起来,方便跨Activity传递 imageUriStringList.add(imageUri.toString()); // 如果需要获取图片的真实路径,可以用ContentResolver查询(Android 10以下适用) String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(imageUri, filePathColumn, null, null, null); if (cursor != null) { cursor.moveToFirst(); String realImagePath = cursor.getString(cursor.getColumnIndex(filePathColumn[0])); // 这里可以对路径做后续处理 cursor.close(); } } } else if (data.getData() != null) { // 单选场景的兼容处理 Uri imageUri = data.getData(); imageUriStringList.add(imageUri.toString()); } // 把URI列表传给第二个Activity Intent toThumbnailIntent = new Intent(this, ThumbnailDisplayActivity.class); toThumbnailIntent.putStringArrayListExtra("SELECTED_IMAGE_URIS", new ArrayList<>(imageUriStringList)); startActivity(toThumbnailIntent); } }
第二个Activity:从URI生成图片缩略图
在这个页面里,先拿到传递过来的URI列表,然后逐个生成缩略图:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_thumbnail_display); // 获取从主Activity传过来的URI字符串列表 ArrayList<String> uriStringList = getIntent().getStringArrayListExtra("SELECTED_IMAGE_URIS"); if (uriStringList != null && !uriStringList.isEmpty()) { for (String uriStr : uriStringList) { Uri imageUri = Uri.parse(uriStr); try { // 用ThumbnailUtils快速生成指定尺寸的缩略图 Bitmap thumbnailBitmap = ThumbnailUtils.extractThumbnail( MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri), 200, 200); // 这里可以根据需求调整缩略图的宽高 // 示例:把缩略图添加到布局里的ImageView(假设你有一个ImageView容器或者RecyclerView) // ImageView thumbnailView = new ImageView(this); // thumbnailView.setImageBitmap(thumbnailBitmap); // containerLayout.addView(thumbnailView); } catch (IOException e) { e.printStackTrace(); // 处理图片加载失败的情况 } } } }
一些小提醒
- 别忘了权限:Android 6.0及以上需要动态申请
READ_EXTERNAL_STORAGE权限(如果访问的是外部存储的图片);Android 10及以上推荐用SAF(存储访问框架),避免直接操作文件路径的限制。 - 如果要处理大量图片,生成缩略图时建议用
BitmapFactory.Options设置采样率,避免OOM(内存溢出)。
内容的提问来源于stack exchange,提问作者erik.b
相关产品推荐
相关产品推荐

