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

Delphi 10.2.3 Android应用接收其他应用图片共享的实现方法

嘿,刚好在Delphi 10.2.3里折腾过这个功能,给你一步步说清楚怎么做:

一、让你的应用出现在图片共享列表(以Android为例)

要让图库这类应用分享图片时显示你的App,核心是在AndroidManifest里配置Intent过滤器,告诉系统你的App能接收图片类型的分享请求。

具体操作:

  1. 打开Delphi项目,依次点击 Project > Options > Application > Manifest
  2. 找到Custom Android Manifest Template(如果没有就启用它),打开AndroidManifest.template.xml文件
  3. 在你的主Activity标签(一般是<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"...>)内部,添加以下intent-filter:
<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="image/*" />
</intent-filter>
  • <action android:name="android.intent.action.SEND" />:表示接收单文件分享请求
  • <category android:name="android.intent.category.DEFAULT" />:让你的App出现在系统的分享列表里
  • <data android:mimeType="image/*" />:指定只接收所有图片类型的文件

保存后重新编译项目,现在图库分享图片时就能看到你的App了。

二、激活应用后获取图片数据

当用户从其他App分享图片到你的App时,系统会通过Intent传递图片的Uri,你需要在App启动/激活时读取这个Uri并获取图片内容。

1. 处理首次启动的情况(App未运行时被唤起)

在主Form的OnCreate事件里添加以下代码:

procedure TMainForm.FormCreate(Sender: TObject);
begin
  // 处理启动时的分享Intent
  ProcessSharedImage(SharedActivity.getIntent);
end;

2. 处理后台唤起的情况(App已在后台运行)

如果你的App已经在后台,系统会通过OnNewIntent事件传递新的Intent,所以需要注册应用事件来监听:

procedure TMainForm.FormCreate(Sender: TObject);
begin
  // 注册应用事件监听
  Application.AddOnApplicationEvent(AppEventHandler);
  // 处理启动时的Intent
  ProcessSharedImage(SharedActivity.getIntent);
end;

procedure TMainForm.AppEventHandler(Sender: TObject; Event: TApplicationEvent; var Handled: Boolean);
begin
  if Event = aeNewIntent then
  begin
    // 处理新的分享Intent
    ProcessSharedImage(SharedActivity.getIntent);
    Handled := True;
  end;
end;

3. 核心处理函数:读取图片数据

把图片处理逻辑抽成一个独立函数,避免代码重复:

procedure TMainForm.ProcessSharedImage(const AIntent: JIntent);
var
  LImageUri: JUri;
  LInputStream: JInputStream;
  LBitmap: JBitmap;
begin
  if (AIntent = nil) then Exit;

  // 检查是否是分享图片的Intent
  if AIntent.getAction.equals(TJIntent.JavaClass.ACTION_SEND) then
  begin
    // 获取图片的Uri
    LImageUri := TJIntent.JavaClass(AIntent).getParcelableExtra(TJIntent.JavaClass.EXTRA_STREAM);
    if LImageUri = nil then Exit;

    try
      // 通过ContentResolver打开输入流
      LInputStream := SharedActivity.getContentResolver.openInputStream(LImageUri);
      if LInputStream = nil then Exit;

      // 解码成Bitmap
      LBitmap := TJBitmapFactory.JavaClass.decodeStream(LInputStream);
      if LBitmap = nil then Exit;

      // 这里可以把Bitmap显示到Image控件,或者保存到本地文件
      Image1.Bitmap.Assign(TBitmap.JPEGFromBitmap(LBitmap));
    finally
      if Assigned(LInputStream) then
        LInputStream.close;
    end;
  end;
end;

注意事项:

  • 权限问题:如果你的App运行在Android 6.0及以上系统,需要动态申请READ_EXTERNAL_STORAGE权限。可以用Delphi自带的TPermissionService来处理:
    uses
      System.Permissions;
    
    procedure RequestStoragePermission;
    begin
      PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE)],
        procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>)
        begin
          if AGrantResults[0] = TPermissionStatus.Granted then
          begin
            // 权限已授予,处理图片
          end;
        end);
    end;
    
  • iOS平台补充:如果需要支持iOS,要在Info.plist里添加文档类型声明,指定支持图片UTI(比如public.image),然后在TApplicationEvent.aeOpenURL事件里处理传入的URL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:49:35