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

如何将图片保存至内部存储并在另一Activity的ImageView中显示

解决Android拍照存内部存储并在另一个Activity显示的问题

我来帮你搞定这个需求!要实现拍照后把图片存到内部存储,再在另一个Activity的ImageView里显示,咱们一步步来:

第一步:配置必要的权限和FileProvider

Android 7.0以上不能直接用file://Uri传递文件,得借助FileProvider,同时相机权限需要动态申请。

  1. 在AndroidManifest.xml里添加权限和FileProvider配置:
<!-- 相机权限声明 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="true" />

<application ...>
    <!-- FileProvider配置,替换成你的应用包名 -->
    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.your_app_package.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
</application>
  1. 创建file_paths.xml文件:
    在res/xml目录下新建该文件,指定内部存储的files目录作为共享路径:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 指向内部存储的files目录,所有子文件都可以共享 -->
    <files-path name="images" path="." />
</paths>

第二步:第一个Activity实现拍照并保存到内部存储

我们会生成一个唯一的图片文件,让相机直接把照片存入这个文件,随后将文件路径传递给第二个Activity。

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {
    private ImageView takePicBtn;
    private File photoFile; // 存储拍照后的文件对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        takePicBtn = findViewById(R.id.takePic);
        takePicBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 先检查相机权限(记得补充动态申请权限的逻辑!)
                Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                // 确保设备上有相机应用能处理这个Intent
                if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                    try {
                        photoFile = createImageFile(); // 创建用于保存图片的文件
                    } catch (IOException e) {
                        e.printStackTrace();
                        // 这里可以给用户提示文件创建失败
                        return;
                    }
                    if (photoFile != null) {
                        // 生成FileProvider的Uri,用于传递给相机应用
                        Uri photoUri = FileProvider.getUriForFile(
                                MainActivity.this,
                                "com.your_app_package.fileprovider", // 和Manifest里的authority保持一致
                                photoFile
                        );
                        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
                        startActivityForResult(takePictureIntent, 100); // 100是自定义的请求码
                    }
                }
            }
        });
    }

    // 创建内部存储的图片文件
    private File createImageFile() throws IOException {
        // 生成唯一文件名,避免重复覆盖
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
        String imageName = "JPEG_" + timeStamp + "_";
        // 获取内部存储的files目录,该目录仅当前应用可访问
        File storageDir = getFilesDir();
        // 创建临时图片文件
        return File.createTempFile(imageName, ".jpg", storageDir);
    }

    // 处理拍照结果
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 100 && resultCode == RESULT_OK) {
            // 拍照成功,跳转至第二个Activity并传递文件路径
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            intent.putExtra("IMAGE_FILE_PATH", photoFile.getAbsolutePath());
            startActivity(intent);
        }
    }
}

第三步:第二个Activity加载图片到ImageView

接收第一个Activity传递的文件路径,将图片加载到目标ImageView中:

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;
import java.io.File;

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        ImageView imageView = findViewById(R.id.targetImageView);
        String imagePath = getIntent().getStringExtra("IMAGE_FILE_PATH");

        if (imagePath != null) {
            // 直接用BitmapFactory加载图片
            Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
            imageView.setImageBitmap(bitmap);

            // 若担心大图导致内存溢出,推荐用Glide/Picasso等图片加载库,示例:
            // Glide.with(this).load(new File(imagePath)).into(imageView);
        }
    }
}

关键注意事项

  • 动态权限申请:Android 6.0及以上系统,必须动态申请CAMERA权限,否则相机无法启动。
  • 避免OOM:高分辨率照片直接用BitmapFactory加载可能引发内存溢出,建议使用专业图片加载库,或手动压缩Bitmap。
  • 内部存储特性:内部存储的文件仅当前应用可访问,卸载应用时会自动删除,完美适配无SD卡的现代手机。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:28:33