返回首页DA系统C#IDE文件同步服务屏保 今天是: 2026-05-05    "立夏"  夏季的第一个节气,表示盛夏时节的正式开始

搜索
热搜: linux 技术
Hi~登录注册
查看: 1841|回复: 0

[转载] 【转载】Unity Native Share 分享插件使用分享(2019适用)

[复制链接]
发表于 2023-11-30 09:15:21 | 显示全部楼层 |阅读模式

少侠不来段修仙之旅吗~

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
Unity Native Share 分享插件(Unity2019适用)


Available on Asset Store: https://assetstore.unity.com/packages/tools/integration/native-share-for-android-ios-112731
Forum Thread: https://forum.unity.com/threads/native-share-for-android-ios-open-source.519865/
Discord: https://discord.gg/UJJt549AaV


GitHub演示Demo:https://yasirkula.itch.io/unity3d

这个插件可以帮助您在 Android 和 iOS 上原生共享文件(图像、视频、文档等)和/或纯文本。ContentProvider 用于在 Android 上共享媒体。

安装

有 5 种方法可以安装此插件:
1.通过 Assets-Import Package 导入 NativeShare.unitypackage
2.克隆/下载此存储库,并将 Plugins 文件夹移动到 Unity 项目的 Assets 文件夹
3.从 Asset Store 导入
4.(通过包管理器)将以下行添加到 Packages/manifest.json:"com.yasirkula.nativeshare": "https://github.com/yasirkula/UnityNativeShare.git",
5.(通过 OpenUPM) 安装 openupm-cli 后,运行以下命令:openupm add com.yasirkula.nativeshare


Android 设置(新版插件不用设置AndroidManifest.xml
NativeShare 不再需要在 Android 上进行任何手动设置。如果您使用的是旧版本的插件,则需要从AndroidManifest.xml中删除NativeShare。<provider ... />
有关参考,旧版文档可在以下位置获得:https://github.com/yasirkula/UnityNativeShare/wiki/Manual-Setup-for-Android


iOS 设置
有两种方法可以在 iOS 上设置插件:
a. 自动设置:(可选)在“项目设置/yasirkula/Native Share”中更改“照片库使用说明”的值
b. 手动设置:请参阅:https://github.com/yasirkula/UnityNativeShare/wiki/Manual-Setup-for-iOS




如何使用?


只需创建一个新的 NativeShare 对象,并根据需要链接以下函数来自定义它(请参阅示例代码):
Clear():清除之前设置的共享内容(如果有)。仅当重复使用相同的 NativeShare 实例以提高内存效率时才有用
SetSubject( string subject ):设置主题(主要用于电子邮件应用程序)
SetText( string text ):设置共享文本。请注意,Facebook 应用将省略文本(如果存在)(请参阅本主题))
SetUrl( string url ):设置共享 URL。在受支持的 iOS 应用程序上,此 URL 用于生成目标网页的预览。其他 iOS 应用可能会将 url 附加到文本中或省略它。在 iOS 上共享文件或在 Android 上共享任何内容时,URL 将附加到文本中(除非文本已包含 URL)
AddFile( string filePath, string mime = null ):将路径处的文件添加到共享操作中。您可以添加多个不同类型的文件。如果保留为 null,则自动确定文件的 MIME;但是,如果文件没有扩展名和/或您已经知道文件的 MIME,则可以手动输入 MIME。MIME 对 iOS 没有影响
AddFile( Texture2D texture, string createdFileName = "Image.png" ):使用指定的文件名将纹理保存到 Application.temporaryCachePath,并将图像文件添加到共享操作中
AddEmailRecipient( string emailAddress ):自动填充 Android 平台上电子邮件应用程序的收件人字段。对 iOS 没有影响
SetTitle( string title ):设置Android平台上共享对话框的标题。对 iOS 没有影响
AddTarget( string androidPackageName, string androidClassName = null ):在Android平台上的特定应用程序上共享内容。如果 androidClassName 保留为 null,则共享对话框中的活动列表将缩小到指定 androidPackageName 中可以处理此共享操作的活动。请注意,androidClassName(如果提供)必须是 Activity 的全名(及其包)。您可以多次调用此函数。此功能对 iOS 没有影响
SetCallback( ShareResultCallback callback ):在共享操作完成后调用回调函数。ShareResultCallback 具有以下签名:void ShareResultCallback( ShareResult result, string shareTarget )ShareResult result可以取 3 个值:未知:我们无法确定用户是否共享了内容
共享:用户可能已共享内容。此值保证用户至少已从共享表中选择了一个应用。但是,无法确定用户是否真的分享了内容,或者在从共享表中选择应用程序后立即取消了操作
NotShared:用户已立即关闭共享表,或者从共享表中选择了一个应用,但随后决定不共享内容(不幸的是,大多数应用在后一种情况下返回共享)
string shareTarget存储有关用户从共享表中选择的应用程序的信息。如果未提供此信息,它可以为 null 或空。通常,这是所选应用程序的包名称/类名称。例如,您可以使用此值来确定用户是否从共享表中选择了 Twitter:shareTarget != null && shareTarget.ToLowerInvariant().Contains( "twitter" )
最后,调用 NativeShare 对象的 Share() 函数将显示共享表。



效用函数

bool NativeShare.TargetExists( string androidPackageName, string androidClassName = null ):返回 Android 设备上是否存在具有指定包/类名的应用程序。如果 androidClassName 保留为 null,则仅查询软件包名称。此函数在 iOS 上始终返回 true
bool FindTarget( out string androidPackageName, out string androidClassName, string packageNameRegex, string classNameRegex = null ):使用正则表达式查找 Android 设备上已安装应用程序的包/类名。如果成功找到匹配的包/类名,则返回 true。当您想要使用 AddTarget 函数但不知道目标活动的确切包/类名称时,它可能很有用。如果 classNameRegex 保留为 null,则返回匹配包中的第一个活动。此函数在 iOS 上始终返回 false



常见问题


Q.我可以在特定应用程序上共享吗?
A.在 Android 上,您可以通过 AddTarget 在特定应用程序上共享。对于 iOS,您可以查看这篇文章,看看它是否适合您: https://forum.unity.com/threads/ ... page-4#post-4011874

Q.我无法在 X 应用程序上共享带有文本的图像
A.在某些应用程序(例如Facebook)上,不可能与文本/主题共享图像/文件,它们故意从共享内容中省略图像或文本。这些应用要求你使用自己的 SDK 执行复杂的共享操作。为了获得最佳兼容性,我建议您仅共享图像或仅共享文本。



Q.我无法将项目构建到 Android,错误消息中显示“Android 资源链接失败:在<manifest>中找到意外元素<查询>”
A.由于新的包可见性更改,NativeShare 向 AndroidManifest.xml 添加了元素。可以按照以下步骤修复构建错误:Android 11、Android 12。 在最坏的情况下,如果您可以接受NativeShare在某些受影响的设备上不起作用,则可以使用WinRAR或7-Zip打开NativeShare.aar,然后从AndroidManifest.xml中删除该元素。<queries><queries>...</queries> (去除该元素已测试有效!)



Q.在 Android 上使用 Unity 作为库时,应用程序在共享文件时崩溃
A.如果您在单独的进程中运行 Unity Activity,请在 NativeShare.aar 中修改 AndroidManifest.xml,以便两者在同一进程上运行,例如:NativeShareCustomShareDialogActivityNativeShareBroadcastListener
<activity android:name=".NativeShareCustomShareDialogActivity" ... android:process=":YourProcess" />
<receiver android:name=".NativeShareBroadcastListener" ... android:process=":YourProcess" />

Q.无法共享,Logcat 中显示“java.lang.ClassNotFoundException: com.yasirkula.unity.NativeShare”
A.如果您确定您的插件是最新的,请从播放器设置中启用自定义 Proguard 文件选项,并将以下行添加到该文件中:-keep class com.yasirkula.unity.* { *; }




Q.使用 Beebyte Obfuscator 时无法共享,它说“异常:没有这样的代理方法:xyz。HasManagedCallback()“在 Logcat 中
A.添加到混淆器设置资产的部分。NativeShareNamespace.NSShareResultCallbackAndroidSkip Classes



 楼主| 发表于 2023-11-30 09:19:12 | 显示全部楼层
示例代码
以下代码会在您点击屏幕时捕获游戏的屏幕截图,将其保存在临时路径中,然后共享它:

void Update()
{
        if( Input.GetMouseButtonDown( 0 ) )
                StartCoroutine( TakeScreenshotAndShare() );
}

private IEnumerator TakeScreenshotAndShare()
{
        yield return new WaitForEndOfFrame();

        Texture2D ss = new Texture2D( Screen.width, Screen.height, TextureFormat.RGB24, false );
        ss.ReadPixels( new Rect( 0, 0, Screen.width, Screen.height ), 0, 0 );
        ss.Apply();

        string filePath = Path.Combine( Application.temporaryCachePath, "shared img.png" );


        //不止可以分享png类型
        //string filePath = Path.Combine( Application.temporaryCachePath, "test.txt" );
        File.WriteAllBytes( filePath, ss.EncodeToPNG() );

        // To avoid memory leaks
        Destroy( ss );

        new NativeShare().AddFile( filePath )
                .SetSubject( "Subject goes here" ).SetText( "Hello world!" ).SetUrl( "https://github.com/yasirkula/UnityNativeShare" )
                .SetCallback( ( result, shareTarget ) => Debug.Log( "Share result: " + result + ", selected app: " + shareTarget ) )
                .Share();

/*
        new NativeShare().AddFile( filePath )
                .SetSubject( "Subject goes here" ).SetText( "Hello world!" ).SetUrl( "https://www.baidu.com" )
                .SetCallback( ( result, shareTarget ) => Debug.Log( "Share result: " + result + ", selected app: " + shareTarget ) )
                .Share();
*/

        // Share on WhatsApp only, if installed (Android only)
        //if( NativeShare.TargetExists( "com.whatsapp" ) )
        //        new NativeShare().AddFile( filePath ).AddTarget( "com.whatsapp" ).Share();
}


回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-30 09:22:09 | 显示全部楼层
GitHub下载并分享,以免哪天上不去或者下载慢(doge)


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
回复 支持 反对

使用道具 举报

游客
回复
*滑块验证:

DA论坛飞机票来了~
快速回复 返回顶部 返回列表