游戏中里开发分享功能时用到两个小功能:1.复制一个链接到剪切板供在其他应用粘贴分享使用,2.保存一张二维码图像到相册供发送给其他应用用于分享。但是在unity中无法完成,需要分别开发相应的插件。

Android 部分:

使用android studio生成jar包(注意:其中

com.ztgame.ztmyseabed 为unity中playersettings里面设置的游戏bundle id

),

ClipboardTools.java 代码如下

package com.ztgame.ztmyseabed; //bundle id,建立工程时设置的包名

import android.app.Activity;
import android.content.ClipboardManager;
import android.content.ClipData;
import android.content.ClipDescription;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.Log; import java.io.File;
import java.io.FileNotFoundException;
import java.lang.reflect.Field; /**
* Created by lanyantao on 2017/6/2.
*/
public class ClipboardTools {
public static ClipboardManager clipboard = null; // 向剪贴板中添加文本
public void copyTextToClipboard(final Context activity, final String str) throws Exception {
clipboard = (ClipboardManager) activity.getSystemService(Activity.CLIPBOARD_SERVICE);
ClipData textCd = ClipData.newPlainText("data", str);
clipboard.setPrimaryClip(textCd);
} // 从剪贴板中获取文本
public String getTextFromClipboard() {
if (clipboard != null && clipboard.hasPrimaryClip()
&& clipboard.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
ClipData cdText = clipboard.getPrimaryClip();
ClipData.Item item = cdText.getItemAt(0);
return item.getText().toString();
}
return "null";
} public void SaveImageToGallery(final Context activity, final String path) {
try{
Context context = activity;
File file = new File(path); String url = "";
// 其次把文件插入到系统图库,(inserImgae中的参数没搞明白,第三个name这个参数不知道意义是什么,保存出来的的图像名称并不是这个name,而是系统按照时间生成的一个数字12496846464836.jpg这样,可否有人告知在下?)
try {
url = MediaStore.Images.Media.insertImage(context.getContentResolver(),
file.getAbsolutePath(), file.getName(), null);
} catch (FileNotFoundException e) {
e.printStackTrace();
} // 最后通知图库更新
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.getPath()))); }catch(Exception e)
{
Log.e("SaveImageToGallery", e.getMessage());
}
}
} //release库打包指令:gradlew assembleRelease,在Terminal中执行即可

打包jar包的时候,我直接生成没有release包,都是debug的jar,如果要生成release的jar,

release库打包指令:gradlew assembleRelease,在Terminal中执行即可,首次执行需要下载一些工具包,会比较慢

也可以直接使用我自己打包的jar文件,路径:http://files.cnblogs.com/files/lan-yt/jar.zip

iOS 部分:
ShareUtil.h 头文件:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h> @ interface ShareUtilLib : NSObject extern "C"
{
/* 接口方法 */
void _SavePhoto(const char *readAddr);
void _copyTextToClipboard(const char *textList);
} - ( void ) imageSaved: ( UIImage *) image didFinishSavingWithError:( NSError *)error
contextInfo: ( void *) contextInfo; @end

ShareUtil.mm 文件(ios中,.m文件为纯object-c语言,.mm文件为object-c和c++混合语言):

#import "ShareUtil.h"

@implementation ShareUtilLib
//将文本复制到IOS剪贴板
- (void)objc_copyTextToClipboard : (NSString *)text
{
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = text;
} - ( void ) imageSaved: ( UIImage *) image didFinishSavingWithError:( NSError *)error
contextInfo: ( void *) contextInfo
{
if (error != nil) {
NSLog(@"二维码保存错误");
}
} @end extern "C" {
static ShareUtilLib *iosClipboard; void _copyTextToClipboard(const char *textList)
{
NSString *text = [NSString stringWithUTF8String: textList] ; if(iosClipboard == NULL)
{
iosClipboard = [[ShareUtilLib alloc] init];
} [iosClipboard objc_copyTextToClipboard: text];
} void _SavePhoto(const char *readAddr)
{
NSString *strReadAddr = [NSString stringWithUTF8String:readAddr];
UIImage *img = [UIImage imageWithContentsOfFile:strReadAddr];
//NSLog([NSString stringWithFormat:@"w:%f, h:%f", img.size.width, img.size.height]);
ShareUtilLib *instance = [ShareUtilLib alloc];
UIImageWriteToSavedPhotosAlbum(img, instance,
@selector(imageSaved:didFinishSavingWithError:contextInfo:), nil);
}
}
unity中使用:
android平台jar文件放在Assets\Plugins\Android下,ios平台直接将上述两页代码放在Assets\Plugins\iOS下
然后在C#调用
using UnityEngine;
using System.Runtime.InteropServices; namespace SDK.Lib
{
/**
* @brief 分享:复制文本到剪切板,保存图像到相册
*/
public class ShareUtil
{ #if UNITY_IOS
/* Interface to native implementation */
[DllImport ("__Internal")]
private static extern void _copyTextToClipboard(string text);
[DllImport ("__Internal")]
private static extern void _SavePhoto(string readAddr);
#endif public ShareUtil()
{ } public void init()
{ } public void dispose()
{ } //复制文本到剪切板
public void copy_text_to_clipboard(string str)
{
#if UNITY_IOS
this.copy_text_ios(str);
#elif UNITY_ANDROID
this.copy_text_android(str);
#endif
} private void copy_text_android(string str)
{
// "com.ztgame.ztmyseabed.ClipboardTools" : java中的类目录 + 类名
AndroidJavaObject androidObject = new AndroidJavaObject("com.ztgame.ztmyseabed.ClipboardTools");
AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
if (activity == null)
return; // 复制到剪贴板
androidObject.Call("copyTextToClipboard", activity, str); // 从剪贴板中获取文本
//string text = androidObject.Call<string>("getTextFromClipboard");
} private void copy_text_ios(string str)
{
#if UNITY_IOS
_copyTextToClipboard(str);
#endif
} //保存图像到相册
public void save_img_to_album()
{
string srcpath = Application.persistentDataPath + "/MyQrCode.png";
Ctx.mInstance.mQrCodeMgr.savePic(srcpath);//先自己保存二维码图片,这个在自己代码中先生成图像 #if UNITY_IOS
this.save_img_ios(srcpath);
#elif UNITY_ANDROID
this.save_img_android(srcpath);
#endif
} //unity中直接保存图片到sdcard,但是不会显示在相册中
private void save_img_android_by_unity(string srcpath)
{
MDataStream srcDataStream = new MDataStream(srcpath);
srcDataStream.open(); byte[] bytes = srcDataStream.readByte();
string destination = "/sdcard/DCIM/ztgame";
//判断目录是否存在,不存在则会创建目录
if (!System.IO.Directory.Exists(destination))
{
System.IO.Directory.CreateDirectory(destination);
}
string path_save = destination + "/myUFO.png";
//存图片
System.IO.File.WriteAllBytes(path_save, bytes); srcDataStream.dispose();
} private void save_img_android(string srcpath)
{
AndroidJavaObject androidObject = new AndroidJavaObject("com.ztgame.ztmyseabed.ClipboardTools");
AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
if (activity == null)
return; // 保存到相册
androidObject.Call("SaveImageToGallery", activity, srcpath);
} private void save_img_ios(string srcpath)
{
#if UNITY_IOS
_SavePhoto(srcpath);
#endif
}
}
}
注意:
iOS10以上的系统访问相册会崩溃,需要添加权限,参照 http://www.jianshu.com/p/e79156f80c22
另外:貌似有些andorid测试不成功,待研究

感谢参考文章:
http://www.cnblogs.com/xiaozefeng/p/Unity_Android_IOS.html
http://blog.csdn.net/st75033562/article/details/52597597
http://www.cnblogs.com/LzwBlog/p/5703590.html
http://blog.csdn.net/AnYuanLzh/article/details/50748928
等等。。。

Unity3d 复制文字到剪切板及存储图像到相册的更多相关文章

  1. angular中复制文字到剪切板

    function copyToClipboard(oElement, value) { var aux = document.createElement("input"); if ...

  2. JS禁止右键查看源码,禁止复制,复制内容到剪切板

    有时候我们希望自己的网页源码不被查看,这时需要关掉鼠标的右击事件;有时候我们也希望禁止选择页面内容Ctrl+C复制. 1.禁止右键查看源码; <script> //设置右键事件 funct ...

  3. C#复制数据到剪切板

    C#复制数据到剪切板 1. 复制固定的数据到剪切板 Clipboard.SetText("123456"); 于是123456就已经复制到剪切板中了,无论在任何地方粘贴都会出现‘1 ...

  4. javascript复制内容到剪切板/网页上的复制按钮的实现

    javascript复制内容到剪切板/网页上的复制按钮的实现:DEMO如下 <!doctype html> <html> <head> <meta chars ...

  5. 在多浏览器使用JS复制内容到剪切板,无需插件

    最近在学习DHTMLX,下载了一些JS源码,使用谷歌浏览器,在学习dhtmlxGrid部分进行复制表格内容时,发现,在线版的可以复制成功,而本地的不可以复制,报类似访问剪切板错误,经查找原因,原来是谷 ...

  6. 简单实现兼容各大浏览器的js复制内容到剪切板

    因为网站文章需要提供几个按钮,单击后实现复制文章内容到剪贴板. 在网上搜索了很多内容,发现都比较乱这里自己整理下,分享给大家 效果图如下: 之前使用的是window.clipboardData.set ...

  7. js复制内容到剪切板,兼容pc和手机端,支持Safari浏览器

      最近,一些项目中用到监听用户复制.剪切的操作. 案例1.在PC端,当用户获得一个京东卡的使用券,当用户使用ctrl + C复制得到的使用券时,将使用券的代号复制到粘贴板,以便于用户ctrl+v进行 ...

  8. js实现复制内容到剪切板,兼容pc和手机端,支持Safari浏览器

    Javascript原生有一些事件:copy.paste.cut, 这些事件可以作用的目标元素: 能获得焦点的元素 (如contentEditable内容能编辑或者可以选中的元素),或者是<bo ...

  9. 手机端点击复制链接到剪切板(以及PC端)

    一直在找如何能点击按钮将一串字符串放到手机的剪切板上,但是可能是因为搜索的关键字不对,一直无果. 向同事请教了一下,给了一个clickboard.js的插件.开始试验的时候,使用手机自带浏览器进行测试 ...

随机推荐

  1. 报表开发之扩展GROUP BY

    在实际运用中.比方在数据仓库中,常常须要对数据进行多维分析.不仅须要标准分组的结果(相当于 GROUP BY),还须要不同维度的小计(简单 GROUP BY 中取部分列分组)和合计(不分组).从而 提 ...

  2. 【Java入门提高篇】Day7 Java内部类——局部内部类

    今天介绍第二种内部类--局部内部类. 局部内部类是什么?顾名思义,那就是定义在局部内部的类(逃).开玩笑的,局部内部类就是定义在代码块.方法体内.作用域(使用花括号"{}"括起来的 ...

  3. 搭建 Keepalived + Nginx + Tomcat 的高可用负载均衡架构

    1 概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已无法承载现有的业务量 ...

  4. 个推demo

    官网文档更详细,这里是只做个测试 http://docs.getui.com/server/java/start/ 全部推送(针对app应用) public static final String a ...

  5. Web前端开发好学吗?谈谈一位学姐的前端工程师之路

    我的第一篇博客....... 我是一名工科女,因高考失利与理想的院校擦肩而过,从而选择了机电专业.毕业后找工作时才发现机电专业的工作并不太适合我.我的父母也支持我转专业求职,但这个过程有时会让我迷茫. ...

  6. 为什么覆写equals()方法的时候总是要覆写hashcode()?

    要回答这个问题,我们应该先认识一下obj中的equals和hascode方法 1.equals()方法在obj中定义如下: public boolean equals(Object obj) { re ...

  7. js判断文件类型大小并给出提示

    上传文件是工作中常用的功能,不同的场景对不同的文件类型和文件大小都有不同的要求: <form id="uploadForm" method="post" ...

  8. 栈stack(2):栈的链表实现

    定义 从上一篇我们知道,栈(stack)是一个只允许一端进行删除插入操作的线性表.同时,我们联想到线性表的链式结构,其特点是用一组任意的存储单元存储线性表的数据元素,因此我们选择使用链表去实现栈,规定 ...

  9. spring boot + Thymeleaf开发web项目

    "Spring boot非常适合Web应用程序开发.您可以轻松创建自包含的HTTP应用.web服务器采用嵌入式Tomcat,或者Jetty等.大多数情况下Web应用程序将使用 spring- ...

  10. UVA 10559 Blocks

    题目大意:有一串带颜色的方块,每次可以消掉颜色相同的一段,得到size^2的分数,问最多能得到多少分数.n≤200. 给这题状态跪下来. 显然的区间DP,但设f[i][j]是不够的. 考虑到之前做过的 ...