Delphi 10.2.3 Android应用接收其他应用图片共享的实现方法
嘿,刚好在Delphi 10.2.3里折腾过这个功能,给你一步步说清楚怎么做:
一、让你的应用出现在图片共享列表(以Android为例)
要让图库这类应用分享图片时显示你的App,核心是在AndroidManifest里配置Intent过滤器,告诉系统你的App能接收图片类型的分享请求。
具体操作:
- 打开Delphi项目,依次点击
Project > Options > Application > Manifest - 找到Custom Android Manifest Template(如果没有就启用它),打开
AndroidManifest.template.xml文件 - 在你的主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
相关产品推荐
相关产品推荐

