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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 07:04:54