如何将图片保存至内部存储并在另一Activity的ImageView中显示
解决Android拍照存内部存储并在另一个Activity显示的问题
我来帮你搞定这个需求!要实现拍照后把图片存到内部存储,再在另一个Activity的ImageView里显示,咱们一步步来:
第一步:配置必要的权限和FileProvider
Android 7.0以上不能直接用file://Uri传递文件,得借助FileProvider,同时相机权限需要动态申请。
- 在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>
- 创建
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
相关产品推荐
相关产品推荐

