You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:15:17