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

Android Java:如何将相机拍摄的图片上传至Firebase Storage

没问题!要把你拍摄的图片上传到Firebase Storage,咱们可以结合你现有的代码一步步实现,我会把关键步骤和代码都列出来:

前提准备

首先确保你的Android项目已经集成了Firebase Storage:

  • 在build.gradle(Module级别)添加依赖:
implementation 'com.google.firebase:firebase-storage:20.0.1' // 可替换为最新版本
  • 并在Firebase控制台完成项目配置(下载google-services.json并放到项目根目录)。

步骤1:初始化Firebase Storage实例

在你的Activity类中声明并初始化StorageReference:

import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;

// 类成员变量
private StorageReference mStorageRef;
private Uri pictureUri;
private static final int CAMERA_PIC_REQUEST = 1;
private static final int PERMISSION_REQUEST_CODE = 2;
private ImageView pic;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    
    pic = findViewById(R.id.your_imageview_id);
    
    // 初始化Firebase Storage
    FirebaseStorage storage = FirebaseStorage.getInstance();
    mStorageRef = storage.getReference();
}

步骤2:完善拍照逻辑(获取原图)

你原代码中通过data.getExtras().get("data")拿到的是缩略图,分辨率很低。推荐直接让相机把照片保存到指定文件,这样能获取完整尺寸的原图:

2.1 添加创建临时图片文件的方法

private File createImageFile() throws IOException {
    // 生成唯一文件名,避免重复覆盖
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    return File.createTempFile(imageFileName, ".jpg", storageDir);
}

2.2 处理ImageView的点击事件(含权限请求)

Android 6.0+需要动态请求相机和存储权限,所以点击ImageView时先检查权限:

pic.setOnClickListener(v -> {
    // 检查权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
            || ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        // 请求权限
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE},
                PERMISSION_REQUEST_CODE);
    } else {
        // 权限已授予,启动相机
        launchCamera();
    }
});

// 权限请求回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == PERMISSION_REQUEST_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
                && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
            launchCamera();
        } else {
            Toast.makeText(this, "需要相机和存储权限才能拍照上传", Toast.LENGTH_SHORT).show();
        }
    }
}

// 启动相机的方法
private void launchCamera() {
    try {
        File photoFile = createImageFile();
        // Android 7.0+ 使用FileProvider避免FileUriExposedException
        pictureUri = FileProvider.getUriForFile(this, "com.your_package_name.fileprovider", photoFile);
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri);
        startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(this, "创建图片文件失败", Toast.LENGTH_SHORT).show();
    }
}

步骤3:实现图片上传到Firebase Storage

在onActivityResult中,拍照完成后执行上传操作:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CAMERA_PIC_REQUEST && resultCode == RESULT_OK) {
        // 先显示拍摄的图片到ImageView
        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), pictureUri);
            pic.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 开始上传图片到Firebase Storage
        // 创建唯一的存储路径,避免文件名重复
        String imageName = UUID.randomUUID().toString() + ".jpg";
        StorageReference imageRef = mStorageRef.child("photos/" + imageName);

        // 上传文件
        imageRef.putFile(pictureUri)
                .addOnSuccessListener(taskSnapshot -> {
                    // 上传成功,获取图片的下载URL
                    imageRef.getDownloadUrl().addOnSuccessListener(downloadUri -> {
                        String downloadUrl = downloadUri.toString();
                        // 可将下载URL保存到Firebase数据库或本地,方便后续使用
                        Toast.makeText(this, "图片上传成功!", Toast.LENGTH_SHORT).show();
                        Log.d("FirebaseStorage", "图片下载URL:" + downloadUrl);
                    });
                })
                .addOnFailureListener(e -> {
                    // 上传失败处理
                    Toast.makeText(this, "上传失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
                    Log.e("FirebaseStorage", "上传错误", e);
                })
                .addOnProgressListener(taskSnapshot -> {
                    // 可选:显示上传进度
                    double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
                    Log.d("FirebaseStorage", "上传进度:" + String.format("%.2f", progress) + "%");
                });
    }
}

权限与FileProvider配置补充

1. 配置AndroidManifest.xml

添加权限和FileProvider声明:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- Android 10+ 可去掉WRITE_EXTERNAL_STORAGE,改用APP专属目录存储 -->

<application ...>
    <!-- FileProvider配置 -->
    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.your_package_name.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
</application>

2. 创建file_paths.xml

在res/xml目录下新建该文件(若无xml目录则手动创建):

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="my_images" path="Pictures" />
</paths>

这样就完成了从拍照、显示到上传Firebase Storage的完整流程啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:09:31