在项目开发和游戏开发中,截图功能是经常会用到的,既然会用到截图功能,伴随的就是保存到相册,之前都是在Unity里面将图片直接保存在DCIM的Camera目录下,但是会出现在手机的相册里面看不到截的图,网上也找了原因,就是虽然目录下有了图片,但是安卓的广播没有告诉相册刷新。所以相册里就看不到截图。所以就有了今天的这种方法。这个方法是,先把图片保存在缓存路径,也就是Application.persistentDataPath,这个路径在任何平台都是可读写的。具体截图的方法可以去Unity3D插件:模仿手机截屏效果的截屏插件这里看,调用安卓方法的工具类Unity3D插件:调用Android原生方法工具类在这里。下面是java代码。这个代码要打成jar包。具体打包方式可以去找度娘解决。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
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的名字,第二个参数是脚本里接收消息的方法名,第三个参数是你保存的图片名(带文件拓展名),这个参数是用来找到保存到缓存路径的图片。文章源自大腿Plus-https://www.zhaoshijun.com/archives/808 文章源自大腿Plus-https://www.zhaoshijun.com/archives/808
我的微信
微信扫一扫
shijun_z
我的QQ
QQ扫一扫
846207670
评论