Android拍照并保存至外部存储,获取路径用作头像加载
Android 拍照保存到外部存储并加载为头像实现
我来分享一套完整的实现方案,刚好对应你要做的拍照保存到外部存储,再用照片路径加载为头像的需求,你的代码已经有了核心部分,我把它补全并加上关键细节说明:
核心实现代码
首先定义类成员变量存储文件和URI,然后实现拍照、结果回调和头像加载逻辑:
// 类成员变量,用于存储拍照后的文件和URI private File file; private Uri photoUri; /** * 启动相机拍照并指定保存路径 */ public void capture() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 生成带时间戳的文件名,避免重复覆盖 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); // 获取应用专属的外部存储图片目录(Android 10+无需申请WRITE_EXTERNAL_STORAGE权限) File picturesDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); file = new File(picturesDir, "img_" + timeStamp + ".jpg"); // 通过FileProvider生成内容URI,适配Android 7.0+的文件访问权限限制 photoUri = FileProvider.getUriForFile(EditProfileActivity.this, BuildConfig.APPLICATION_ID + ".fileprovider", file); // 指定照片保存的目标URI intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); // 启动相机Activity,等待结果返回(请求码1001为自定义标识) startActivityForResult(intent, 1001); } /** * 处理相机返回的结果(适配旧版API,AndroidX推荐用registerForActivityResult替代) */ @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1001 && resultCode == RESULT_OK) { // 拍照成功,获取照片绝对路径 String photoPath = file.getAbsolutePath(); // 调用方法加载头像 loadAvatarFromPath(photoPath); } } /** * 从本地路径加载头像到ImageView */ private void loadAvatarFromPath(String photoPath) { ImageView avatarIv = findViewById(R.id.avatar_iv); // 方案1:用Glide加载(需先引入Glide依赖),支持圆形裁剪等头像常用效果 Glide.with(this) .load(new File(photoPath)) .circleCrop() .into(avatarIv); // 方案2:原生API加载(适合简单场景) // Bitmap bitmap = BitmapFactory.decodeFile(photoPath); // avatarIv.setImageBitmap(bitmap); }
关键配置与适配要点
FileProvider配置(必须):
要适配Android 7.0+的文件权限,需要在AndroidManifest.xml中注册FileProvider:<application> ... <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> </application>同时在
res/xml目录下创建file_paths.xml文件,指定可访问的目录:<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="my_pictures" path="Pictures" /> </paths>AndroidX推荐方案:
如果项目使用AndroidX,建议用ActivityResultContracts.TakePicture替代过时的startActivityForResult:// 初始化拍照回调 private ActivityResultLauncher<Uri> takePictureLauncher = registerForActivityResult( new ActivityResultContracts.TakePicture(), result -> { if (result) { String photoPath = file.getAbsolutePath(); loadAvatarFromPath(photoPath); } }); // 修改后的capture方法 public void capture() { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); File picturesDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); file = new File(picturesDir, "img_" + timeStamp + ".jpg"); photoUri = FileProvider.getUriForFile(EditProfileActivity.this, BuildConfig.APPLICATION_ID + ".fileprovider", file); takePictureLauncher.launch(photoUri); }权限适配:
Android 9及以下版本,需要在Manifest中声明WRITE_EXTERNAL_STORAGE权限,并在运行时动态申请;Android 10+使用getExternalFilesDir()无需申请该权限。
内容的提问来源于stack exchange,提问作者Scott Kim
相关产品推荐
相关产品推荐

