遊戲中裏開發分享功能時用到兩個小功能:1.複製一個連接到剪切板供在其餘應用粘貼分享使用,2.保存一張二維碼圖像到相冊供發送給其餘應用用於分享。可是在unity中沒法完成,須要分別開發相應的插件。html
Android 部分:java
使用android studio生成jar包(注意:其中android
com.ztgame.ztmyseabed 爲unity中playersettings裏面設置的遊戲bundle id
),ios
ClipboardTools.java 代碼以下c++
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,app
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++混合語言):ide
#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.htmlhttp://blog.csdn.net/st75033562/article/details/52597597http://www.cnblogs.com/LzwBlog/p/5703590.htmlhttp://blog.csdn.net/AnYuanLzh/article/details/50748928等等。。。