Unity3d 複製文字到剪切板及存儲圖像到相冊

遊戲中裏開發分享功能時用到兩個小功能: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等等。。。
相關文章
相關標籤/搜索