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

如何将Codename One录制的视频通过原生系统分享?ShareButton仅支持图文

嘿,我来帮你搞定在Codename One里分享视频的问题!默认的ShareButton确实只支持文本和图片分享,但咱们可以通过**原生接口(NativeInterface)**来扩展功能,直接调用Android和iOS的原生分享能力,完美实现视频分享。

具体实现步骤

1. 定义NativeInterface接口

首先在Codename One项目里创建一个Java接口,用来统一视频分享的调用方法:

public interface VideoShare extends NativeInterface {
    // 传入视频文件路径,返回分享是否成功
    boolean shareVideo(String videoFilePath);
}

2. 实现Android端原生逻辑

Android端需要借助Intent和FileProvider来实现视频分享,确保其他应用能访问到你的视频文件:

public class VideoShareImpl implements VideoShare {
    @Override
    public boolean shareVideo(String videoFilePath) {
        File videoFile = new File(videoFilePath);
        if (!videoFile.exists()) {
            return false;
        }
        
        // 使用FileProvider获取文件Uri,避免权限问题
        Uri videoUri = FileProvider.getUriForFile(
            AndroidNativeUtil.getContext(),
            AndroidNativeUtil.getContext().getPackageName() + ".fileprovider",
            videoFile
        );
        
        Intent shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.setType("video/*"); // 指定分享类型为视频
        shareIntent.putExtra(Intent.EXTRA_STREAM, videoUri);
        shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 授予读取权限
        
        // 弹出系统分享选择器
        AndroidNativeUtil.startActivity(Intent.createChooser(shareIntent, "分享视频"));
        return true;
    }

    @Override
    public boolean isSupported() {
        return true;
    }
}

重要配置: 要在AndroidManifest.xml中添加FileProvider配置,确保文件能被其他应用访问:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

同时在res/xml目录下创建file_paths.xml文件(根据你的视频存储路径调整):

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 这里假设视频存在应用的外部存储videos目录下 -->
    <external-files-path name="my_videos" path="videos/" />
</paths>

3. 实现iOS端原生逻辑

iOS端使用UIActivityViewController来唤起系统分享面板,代码如下:

#import "CodenameOne_GLViewController.h"
#import <MobileCoreServices/MobileCoreServices.h>

@implementation VideoShareImpl

-(BOOL)shareVideo:(NSString*)videoFilePath {
    NSURL *videoURL = [NSURL fileURLWithPath:videoFilePath];
    if (![[NSFileManager defaultManager] fileExistsAtPath:videoFilePath]) {
        return NO;
    }
    
    // 创建分享控制器,传入视频文件URL
    UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[videoURL] applicationActivities:nil];
    // 可以排除不需要的分享选项,比如打印、联系人分配
    activityVC.excludedActivityTypes = @[UIActivityTypeAssignToContact, UIActivityTypePrint];
    
    // 获取当前顶层ViewController,弹出分享面板
    UIViewController *rootVC = [(CodenameOne_GLViewController*)[UIApplication sharedApplication].keyWindow.rootViewController getTopMostController];
    [rootVC presentViewController:activityVC animated:YES completion:nil];
    return YES;
}

-(BOOL)isSupported {
    return YES;
}

@end

4. 在Codename One主代码中调用

现在就可以在你的业务代码里调用这个原生接口了:

// 获取原生接口实例
VideoShare videoShare = (VideoShare) NativeLookup.create(VideoShare.class);
if (videoShare != null && videoShare.isSupported()) {
    // 替换成你的实际视频文件路径,比如录制后的视频存储路径
    String videoPath = FileSystemStorage.getInstance().getAppHomePath() + "recorded_video.mp4";
    boolean shareSuccess = videoShare.shareVideo(videoPath);
    if (!shareSuccess) {
        Dialog.show("提示", "视频文件不存在或无法分享", "确定", null);
    }
} else {
    Dialog.show("提示", "当前平台暂不支持视频分享", "确定", null);
}

额外注意点

  • 确保视频文件路径正确,并且应用拥有该文件的读取权限
  • Android端的FileProvider配置要和视频存储路径对应,避免权限拒绝
  • iOS上如果视频是临时文件,要确保在分享完成前不要删除该文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:22:31