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

拍照保存至外部存储后,如何将图片显示到ImageView?

Got it, let's work through this problem step by step. Since your Toast is showing the correct file path, the photo is definitely being saved—so the issue is almost certainly tied to how Picasso is accessing the file, or some Android storage behavior you might be overlooking. Here are the most common fixes:

1. Fix Storage Permission Issues (Critical for Android 10+)

Starting with Android 10 (API 29), Scoped Storage restricts direct access to external storage files, even if you have the WRITE_EXTERNAL_STORAGE permission. If your app targets API 29+, Picasso might not be able to load the file via its raw path.

Quick Test Fix (Legacy Compatibility)

Add this attribute to your <application> tag in AndroidManifest.xml to temporarily bypass Scoped Storage:

<application
    ...
    android:requestLegacyExternalStorage="true">

Proper Long-Term Fix (Use FileProvider)

For production apps, use FileProvider to generate a content URI that Picasso can access safely:

  • First, register the provider in AndroidManifest.xml:
    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
    
  • Create a res/xml/file_paths.xml file to define the storage path your app can access:
    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- Adjust the path to match where you're saving photos -->
        <external-files-path name="camera_photos" path="Pictures" />
    </paths>
    
  • Generate the content URI and load it with Picasso:
    File photoFile = new File(yourSavedPhotoPath);
    Uri photoUri = FileProvider.getUriForFile(
        getApplicationContext(),
        BuildConfig.APPLICATION_ID + ".fileprovider",
        photoFile
    );
    Picasso.get().load(photoUri).into(yourImageView);
    

2. Ensure the File is Fully Written Before Loading

Sometimes Picasso tries to load the file before the camera or save operation has finished writing it to disk. Add a check to confirm the file exists and has valid size:

// After confirming the photo was saved
File photoFile = new File(yourSavedPhotoPath);
if (photoFile.exists() && photoFile.length() > 0) {
    // Now load with Picasso
    Picasso.get().load(photoFile).into(yourImageView);
} else {
    Toast.makeText(this, "Photo not fully saved yet", Toast.LENGTH_SHORT).show();
}

3. Add Picasso Error Listening to Diagnose the Exact Issue

You’re missing visibility into why Picasso is failing. Add a callback to log errors:

Picasso.get()
    .load(yourSavedPhotoPath)
    .error(R.drawable.error_placeholder) // Show a placeholder if load fails
    .into(yourImageView, new Callback() {
        @Override
        public void onSuccess() {
            Log.d("Picasso", "Photo loaded successfully!");
        }

        @Override
        public void onError(Exception e) {
            Log.e("Picasso Error", "Failed to load photo: " + e.getMessage());
            Toast.makeText(getApplicationContext(), "Load error: " + e.getMessage(), Toast.LENGTH_LONG).show();
        }
    });

This will tell you exactly what’s wrong—like permission denied, file not found, or corrupted file.

4. Check ImageView Configuration

Sometimes the photo loads but isn’t visible due to ImageView settings:

  • Set a clear scaleType (e.g., fitCenter or centerCrop)
  • Ensure the ImageView has a defined size (avoid wrap_content for both width/height if the photo is very large)
<ImageView
    android:id="@+id/photoImageView"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:scaleType="fitCenter" />

5. Clear Picasso’s Cache (For Testing)

Picasso might be caching a previous failed load. Invalidate the cache before loading:

Picasso.get().invalidate(yourSavedPhotoPath);
Picasso.get().load(yourSavedPhotoPath).into(yourImageView);

Start with the error callback—it’ll give you the most direct clue about what’s going wrong. From there, you can target the fix (permission, file write timing, etc.)

内容的提问来源于stack exchange,提问作者user8515823

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:58:40