Unity3D Android:截图保存并显示到相册

在项目开发和游戏开发中,截图功能是经常会用到的,既然会用到截图功能,伴随的就是保存到相册,之前都是在Unity里面将图片直接保存在DCIM的Camera目录下,但是会出现在手机的相册里面看不到截的图,网上也找了原因,就是虽然目录下有了图片,但是安卓的广播没有告诉相册刷新。所以相册里就看不到截图。所以就有了今天的这种方法。这个方法是,先把图片保存在缓存路径,也就是Application.persistentDataPath,这个路径在任何平台都是可读写的。具体截图的方法可以去Unity3D插件:模仿手机截屏效果的截屏插件这里看,调用安卓方法的工具类Unity3D插件:调用Android原生方法工具类在这里。下面是java代码。这个代码要打成jar包。具体打包方式可以去找度娘解决。

package com.thigh.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import com.unity3d.player.UnityPlayer;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;

public class UnityMainActivity extends com.unity3d.player.UnityPlayerActivity {
	private String TAG_UNITY = "Unity";// 打印标签

	public Context context;
    public UnityMainActivity mainActivity;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mainActivity = this;
	}
	// 保存到相册
    public void savePhoto(final String UNITY_GO_NAME,final String UNITY_CALLBACK_MOTHED_NAME,final String fileName) {
    	
		Log.i(TAG_UNITY, "unity对象的名字为:" + UNITY_GO_NAME + ",对象上脚本的方法名为:" + UNITY_CALLBACK_MOTHED_NAME);
		
        context = mainActivity.getApplicationContext();
 
        mainActivity.runOnUiThread(new Runnable() {
            public void run() {
 
                Bitmap bitmap = BitmapFactory.decodeFile(Environment
                        .getExternalStorageDirectory()
                        + "/Android/data/" + mainActivity.getPackageName() + "/files/"
                        + fileName);
 
                File file = new File(Environment.getExternalStorageDirectory()
                        + "/DCIM/Camera", fileName);
 
                FileOutputStream fos = null;
                try {
                    fos = new FileOutputStream(file);
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    Log.w("cat", e.toString());
                }
                bitmap.compress(CompressFormat.PNG, 100, fos);
 
                try {
                    fos.flush();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    Log.w("cat", e.toString());
                }
                try {
                    fos.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    Log.w("cat", e.toString());
                }
                bitmap.recycle();//扫描保存的图片
                context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" +Environment.getExternalStorageDirectory()
                        + "/DCIM/Camera/"+fileName)));
                 
                Toast.makeText(context, "照片已保存到相册", Toast.LENGTH_SHORT).show();
                UnityPlayer.UnitySendMessage(UNITY_GO_NAME, UNITY_CALLBACK_MOTHED_NAME, "1");
            }
        });
    }
}

当然脚本里的包名要和你Unity的PlayerSetting里的包名一致,还要配置Xml里的MainActivity。在保存完的时候我给Unity返回了一个消息,方法里的第一个参数就是Unity里接收消息的脚本的gameObject的名字,第二个参数是脚本里接收消息的方法名,第三个参数是你保存的图片名(带文件拓展名),这个参数是用来找到保存到缓存路径的图片。

You May Also Like

About the Author: 大腿Plus

发表评论