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
相关产品推荐
相关产品推荐

