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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:48:18