Delphi 12 Android中MediaStore类及相关单元缺失问题咨询
Delphi 12 Android开发中MediaStore相关问题解决
一、MediaStore的位置
在Delphi 12的Android开发环境里,MediaStore对应的是JMediaStore,属于Androidapi.JNI.Media单元,代码里必须引用这个单元才能调用相关API。
二、'Androidapi.Nin.MediaStore'单元缺失的原因及替代方案
- 原因:这个单元是旧版Delphi(比如XE系列)的遗留命名,Delphi 12已经改用统一的JNI风格单元命名,旧的
Androidapi.Nin.*系列单元已经被移除或废弃。 - 替代方案:直接引用
Androidapi.JNI.Media单元,用JMediaStore替代原来的MediaStore操作逻辑即可。
三、JMediaStore使用错误的修正及代码优化
你贴的代码有两个核心问题:一是Android版本兼容性(Android 10及以上MediaColumns.DATA已被废弃,会返回空值),二是要确保单元引用正确。修正后的代码如下:
uses Androidapi.JNI.Media, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, Androidapi.Helpers; // 传入已获取的JCursor对象,获取图片路径 procedure GetSelectedImagePath(Cursor: JCursor); var ColumnIndex: Integer; filePath: string; begin try // Android 10+推荐用RELATIVE_PATH替代DATA ColumnIndex := Cursor.getColumnIndex(JMediaStore.MediaColumns.RELATIVE_PATH); if ColumnIndex >= 0 then begin Cursor.moveToFirst; // 拼接外部存储根路径得到完整路径 filePath := JStringToString(TAndroidHelper.ExternalStorageDirectory.absolutePath) + '/' + JStringToString(Cursor.getString(ColumnIndex)); end else begin // 兼容低版本Android, fallback到DATA字段 ColumnIndex := Cursor.getColumnIndex(JMediaStore.MediaColumns.DATA); if ColumnIndex >= 0 then begin Cursor.moveToFirst; filePath := JStringToString(Cursor.getString(ColumnIndex)); end; end; if filePath <> '' then ShowMessage('Selected Image Path: ' + filePath); finally Cursor.close; end; end;
补充注意事项
- 必须在项目中添加
Androidapi.JNI.Media单元的引用; - Android 10及以上启用了分区存储,
MediaColumns.DATA字段会返回空值,必须用RELATIVE_PATH结合外部存储路径拼接完整地址; - 如果还是找不到JMediaStore,检查Delphi的Android SDK配置是否正确,建议使用Android 13或14版本的SDK。
内容的提问来源于stack exchange,提问作者Wang Hua
相关产品推荐
相关产品推荐

