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

Android植物添加模块BitmapFactory图片解码失败问题求助

问题修复方案

核心问题分析

报错FileNotFoundException: /data/user/0/com.example.plant/files/image.jpeg是因为你硬编码了解码路径,但从未将拍摄/选择的图片保存到该位置;同时拍照后通过FileProvider获取的imageUri.getPath()是虚拟路径,并非真实文件路径,导致后续文件存在性判断失效。


具体修复步骤

1. 删除无效的文件解码代码

在onActivityResult的TAKE_PHOTO分支中,直接移除这行无效代码:

String filePath = getFilesDir().getAbsolutePath()+"/image.jpeg";
bitmap = BitmapFactory.decodeFile(filePath);

这行代码尝试解码一个从未创建的文件,是触发报错的直接原因。

2. 正确获取拍照图片的真实路径

在AddActivity中新增成员变量存储拍照文件,避免依赖虚拟路径:

private File photoFile; // 新增成员变量

修改openCamera方法,保存创建的文件对象:

private void openCamera(){
    String imageName = new SimpleDateFormat("yyyyMMddHHmm", Locale.getDefault()).format(new Date());
    String authority = "com.example.plant.file-provider";
    photoFile = new File(Environment.getExternalStorageDirectory(), imageName + ".jpg");
    
    try{
        if(photoFile.exists()){
            photoFile.delete();
        }
        boolean isCreated = photoFile.createNewFile();
        Log.e("createNewFile", String.valueOf(isCreated));
    }catch (IOException e){
        e.printStackTrace();
    }
    
    imageUri = FileProvider.getUriForFile(this, authority, photoFile);
    Intent intent0=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent0.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    startActivityForResult(intent0,TAKE_PHOTO);
}

在onActivityResult的TAKE_PHOTO分支中,直接使用真实文件路径:

case TAKE_PHOTO:
    if (resultCode == RESULT_OK) {
        MediaScannerConnection.scanFile(this, new String[] { photoFile.getAbsolutePath() }, null, (path, uri) -> {
            Log.i("TAG", "Scanned " + path + ":");
            Log.i("TAG", "-> uri=" + uri);
        });
        
        try {
            bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        
        picpath = photoFile.getAbsolutePath();
        Log.e("picpath",picpath);
        img_result.setImageBitmap(bitmap);
        AddActivity.picpath = picpath;
    }break;

3. 修正按钮点击的错误逻辑

按钮点击时不要尝试启动MyDatabaseHelper(它不是Activity,无法通过startActivity启动),移除以下无效代码:

String filePath = getFilesDir().getAbsolutePath()+"/image.jpeg";
Uri fileUri = Uri.parse(filePath);
Intent intent = new Intent(AddActivity.this, MyDatabaseHelper.class);
intent.putExtra("fileUri", fileUri);
startActivity(intent);

4. 修复数据库表创建的语法错误

MyDatabaseHelper的onCreate方法中,表创建语句存在语法错误,修正为:

@Override
public void onCreate(SQLiteDatabase db) {
    String query = "CREATE TABLE " + TABLE_NAME +
            " ("+ COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+ 
            COLUMN_NAME + " TEXT, "+ 
            COLUMN_VAR + " TEXT, "+ 
            COLUMN_HEIGHT + " INTEGER, "+ 
            COLUMN_TARGET + " DOUBLE)"; // 补充空格,修正括号位置
    db.execSQL(query);
}

5. 完善数据库添加方法的文件处理

在addPlant方法中,使用真实路径判断文件存在性,并可将图片路径存入数据库:

void addPlant(String name,String var,int height) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues hhh = new ContentValues();

    hhh.put(COLUMN_NAME,name);
    hhh.put(COLUMN_VAR,var);
    hhh.put(COLUMN_HEIGHT,height);

    String filePath = AddActivity.picpath;
    if(filePath != null && !filePath.isEmpty()){
        File file = new File(filePath);
        if(file.exists()) {
            hhh.put("image_path", filePath); // 假设表中新增image_path字段存储图片路径
        }
    }

    long result = db.insert(TABLE_NAME,null,hhh);
    if(result == -1){
        Toast.makeText(context,"添加失败",Toast.LENGTH_SHORT).show();
    }else
        Toast.makeText(context,"添加成功",Toast.LENGTH_SHORT).show();
}

6. 移除updateData方法的无效代码

updateData方法中未定义intent变量,直接移除这段代码:

Uri imageUri = Uri.parse(intent.getStringExtra("imageUri"));
String filePath = imageUri.getPath();

权限补充

确保在AndroidManifest.xml中添加必要权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

Android 13及以上版本需单独申请媒体权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:57:04