保存二维码图片到手机相册

项目unity游戏在接sdk分享的时候,感觉这个东西可以写一下:
//首先用C#代码保存预设中的二维码到本地

public virtual void savePng(string fileName,RawImage image)
{
    Texture2D tex = image.mainTexture as Texture2D;
    if(tex == null) return;
    string filePath = Application.persistentDataPath + "/code/";
    if(!Directory.Exists(filePath))
    {
        Directory.CreateDirectory(filePath);
    }
    byte[] allBt = tex.EncodeToPng();
    try
    {
        File.WriteAllBytes(filePath+fileName+".png",allBt);
    }
    catch(IOException e)
    {
    }
    call("savePng",fileName,filePath);
}

注意,这里的call是调用Android里面的方法,为什么要调用sdk来保存,因为直接保存到本地,是无法刷新相册的,需要sdk来刷新相册,这样玩家打开相册就可以看到保存下来的二维码

//Android sdk mainActivity 的方法
public void savePng(final String fileName,final String filePath)
{
    this.runOnUiThread(new Runnable(){
            public void run(){
                Bitmap bitmap = BitmapFactory.decodeFile(filePath+fileName+".png");
                File dir = new File(Environment.getExternalStorageDirectory()+"DCIM/Camera");
                if(!dir.exists() && !dir.isDirectory())
                {
                    dir.mkdir();
                }
                File file = new File(Environment.getExternalStorageDirectory()+"DCIM/Camera"+fileName+".jpg");
                if(!file.exists())
                {
                    try
                    {
                        file.createNewFile();
                    }
                    catch(IOException e)
                    {
                    e.printStackTreace();
                    }
                }
                FileOutPutStream fos = null;
                try
                {
                    fos  = new FileOutputStream(file);
                }
                catch(FileNotFoundException e)
                {
                    e.printStackTreace();
                }
                bitmap.compress(CompressFormat.JPEG,100,fos);
                try
                {
                    fos.flush();
                }
                catch(IOException e)
                {
                    e.printStackTreace();
                }
                try
                {
                    fos.close();
                }
                catch(IOException e)
                {
                    e.printStackTreace();
                }
                bitmap.recycle();
                //刷新相册操作,必要!
                Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                Uri contentUri = Uri.fromFile(file);
                mediaScanIntent.setData(contentUri);
                this.sendBroadcast(mediaScanIntent);
        }
    }
}

//需要注意的是一般二维码只需要保存一次即可,可以判断下是否已经保存,毕竟这是持久化操作,Texture2D每次要拷贝一份数据作为副本来写入图片,比较耗性能,RawImage对应的texture如果是二进制,通过下面方法设置——

pubilc static void SetTexture(RawImage image,string qrdata)
{
    byte[] data = System.Convert.FromBase64String(qrdata);
    Texture2D tex = new Texture2D(350,350);
    tex.LoadImage(data);
    image.texture = tex;
}

如果是图片,需要设置是Advanced格式,勾选Read/Write Enabled,还有Encode as RGBM 选择Encoded,这样才能读取和写到本地。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值