首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三)
2012
07-13

Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三)

         最近做项目需要用到这个功能,就是在Unity中调用Android本地相册或直接打开摄像机拍照并且裁剪一部分用于用户头像,今天研究了一下,那么研究出成果了MOMO一定要分享给大家。Unity与Android的交互还有谁不会?? 如果有不会的朋友请看MOMO之前的文章喔,Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)这里有关交互的方式就不详细说明,主要将如何在Unity中打开摄像机、在Unity中打开本地相册,选一个照片后如何进行裁剪,最后将图片转换成Texture显示在U3D的世界当中。

首先看看Eclipse中的Android插件部分,我的包名是com.xys请大家与MOMO保持一致,Unity工程中也需要是这个包名噢。

UnityTestActivity.java 这个类是Unity的插件主类,在这里调用是打开摄像机 还是本地相册的方法。

 

然后是WebViewActivity.java 这里主要处理用户打开摄像机或本地相册后如何进行裁剪图片,并且把裁剪的图片储存在本地文件中。

 

注解1:主要是路径”/mnt/sdcard/Android/data/com.xys/files”,如下图所示,我们在这里把文件保存在这个路径下。为什么要把图片2进制文件写在这里呢? 还记得以前MOMO给大家说过在Unity中访问Android或IOS本地2进制文件时用到的这个路径,

Application.persistentDataPath   该路径等价于 /mnt/sdcard/Android/data/com.xys/files ,当然后者的包名是对应的工程包名,这样在Unity中可以找到对应裁剪后的图片文件,并且显示在Unity中。

Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三) - 雨松MOMO程序研究院 - 1

 

AndroidManifest.xml  这个文件也没什么好说的,大家看看吧。

 

然后把上面的Android工程打包做成插件放在Unity中。如下图所示,这个我的Unity工程中对应的路径。如果看不懂的朋友请看我之前的文章哈。

 

Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三) - 雨松MOMO程序研究院 - 2

 

然后看Test.cs脚本,它直接挂在摄像机身上。

 

注解1:请大家一定要注意这个路径的写法, 前面一定要加 “File://” 不然无法读取。OK说了这么多我们看看这个项目运行的效果,激动人心的时刻来临啦 嚯嚯嚯嚯!!!

1.首次进入的画面, 这里的图片是我刚刚从相册选择的

 

Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三) - 雨松MOMO程序研究院 - 3

 


2.打开相册我们选择一张图片

Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三) - 雨松MOMO程序研究院 - 4

 

3. 选择一张图片,我们进行裁剪

 

Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三) - 雨松MOMO程序研究院 - 5

 

最后我们返回到Unity中界面。新的图片Unity已经完成读取,界面上已经修改成刚刚我裁剪的啦,哇咔咔。 怎么样,还不错啦? 哈哈后。这个做用户头像肯定给力 蛤蛤。

 

Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三) - 雨松MOMO程序研究院 - 6

如果点击打开摄像机按钮,拍照完毕后会提示裁剪,裁减完毕返回到Unity界面中同样能看到效果。
最后MOMO将本篇博文的源码放出来,  源码包括Android的工程 与Unity的工程,雨松MOMO祝大家学习愉快,大家互相学习互相进步,加油哇咔咔,啦啦啦。
最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三)》有 135 条评论

  1. mengxiang1023 说:

    IOS下怎样调用呀?

  2. 李佳泽 说:

    大神,求IOS的代码。 Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三) - 雨松MOMO程序研究院 - 1

  3. 羽麟 说:

    而且就算我能够发布apk成功,还是不能够在手机上使用!!!!

  4. 羽麟 说:

    你好,我这边用Unity5一导入就会出现——Error importing folder (The pathName assets/plugins is already mapped to 0c7674125e022374aa44cc8ca91914a6. But the meta data wants it to be mapped to 85cb79cb52f1644f1a72b47f15a4aa79)这个错误,请问我应该怎么解决??? Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三) - 雨松MOMO程序研究院 - 1

  5. paulpn 说:

    拍照、剪切和保存都没有问题,但最后的显示不成功啊,好像是string path = “file://” Application.persistentDataPath “/” name;没能读到这个图片。请问雨神,你在android测试过吗,是不是playerseting的问题?

  6. paulpn 说:

    拍照、剪切和保存都没有问题,但最后的显示不成功啊,好像是string path = “file://” + Application.persistentDataPath +”/” + name;没能读到这个图片。请问雨神,你在android测试过吗,是不是playerseting的问题?

  7. 咸鱼 说:

    请教下,为啥我发布的时候出现了CommandInvokationFailure: Unable to convert classes into dex format. See the Console for details.C:Program Files (x86)Javajdk1.8.0_45binjava.exe -Xmx1024M -Dcom.android.sdkmanager.toolsdir=”D:/android-sdktools” -Dfile.encoding=UTF8 -jar “D:/Unity5.0/Editor/Data/BuildTargetTools/AndroidPlayersdktools.jar” -stderr[这情况,怎么解决?

  8. kk 说:

    我想在unity里获取Android系统相册的路径怎么弄啊

  9. 为什么unity里面收不到message呢?

  10. Mercurial 说:

    收了海飞丝多少钱?

  11. hello 说:

    松神,例子怎么下不了

  12. 赵川 说:

    雨大,问个事啊,我把你代码拷贝下来 不管是拍照还是打开相册剪切图片点保存的时候程序会闪退 是为什么

  13. Murphy 说:

    最近公司项目也需要这个内容,安卓代码有限,雨神能指点下他问的问题吗? Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三) - 雨松MOMO程序研究院 - 1 拜托了

  14. 张艳磊 说:

    为什么一运行你的包到爆出来的apk jiu bengkui le

  15. xipeng_me 说:

    请问解决了吗?

  16. xipeng_me 说:

    大神,请教一下如何把截图发送到web服务器? Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三) - 雨松MOMO程序研究院 - 1

  17. 屌屌的... 说:

    MOMO ,代码链接那里,那两个文件夹不打包无法下载呀!! 文章很不错,学习了。

  18. 说:

    我用你的程序竖屏是没问题的,换成横屏就出现问题了。不知道你试过没有?

  19. 小龙 说:

    直接用真机测试就不会有这个问题了。

  20. 镜花水月 说:

    雨神,如果要调用的 Android 方法要传递多个参数,像这样 jo.Call(“Buy”, “Test0001”, “钻石”, “金币”, “test01”, “test==”, “isnull==”, “100010”, “蜃梦楼oy”, 10, 20000, 10); 但是总是提示 AndroidJavaException: java.lang.NoSuchMethodError: ,Android 中的方法是有的

  21. 镜花水月 说:

    雨神,想请教一个问题。如果我想调用的Activity 不是主activity 是不是把 AndroidJavaObject jo = jc.GetStatic(“currentActivity”);中的currentActivity换成我的activity?我这样做了但我的Activity中的方法没有被调用,已经在 AndroidManifest.xml 中加入了 ,是不是要先启动我的Activity?请雨神指点一下

    • 雨松MOMO 说:

      AndroidJavaObject jo = jc.GetStatic(“currentActivity”); 或者你还可以用 AndroidJavaClass class = new AndroidJavaClass(“com.koramgame.xxsr.myclass”); 去取一个类。。

    • 雨松MOMO 说:

      AndroidJavaObject jo = jc.GetStatic(“currentActivity”); 或者你还可以用 AndroidJavaClass class = new AndroidJavaClass(“com.momo.momo.myclass”); 去取一个类。。

      • 镜花水月 说:

        多谢雨神, 我是这样调用的 using (AndroidJavaClass aj = new AndroidJavaClass(“com.kingnet.qmonster.AndquitActivity”)) { AndroidJavaObject jo = aj.GetStatic(“currentActivity”); xValue = jo.Call(“getNum”); }但是 好像没有获得jo对象,在 AndroidJavaObject jo = aj.GetStatic(“”)中应该传什么参数呢?

        • 雨松MOMO 说:

          AndroidJavaClass myClass = new AndroidJavaClass(“com.kingnet.qmonster.AndquitActivity”);myClass.CallStatic(“startFunc”); startFunc 要是静态方法。。

          • 镜花水月 说:

            多谢雨神,但是如果这样,我只能调用Android的静态方法了,如果我想调用 Android 中 public void onBackPressed() { }这样不是静态的复写方法该怎么解决呢?

          • 镜花水月 说:

            雨神,怎样调用非静态方法呢?或者怎样才能获得类的实例呢? 我在 Activity 的onCreate 方法中 instanse = this ; 给这个类的静态实例,但发现 onCreate 并没有执行。求雨神指点啊

        • 雨松MOMO 说:

          AndroidJavaClass myClass= new AndroidJavaClass(“com.kingnet.qmonster.AndquitActivity”);myClass.CallStatic(“startFunc”); startFunc 要是静态方法。。

    • 雨松MOMO 说:

      AndroidJavaObject jo = jc.GetStatic(“currentActivity”); 或者你还可以用 AndroidJavaClass class= new AndroidJavaClass(“com.koramgame.xxsr.myclass”); 去取一个类。。

    • 雨松MOMO 说:

      AndroidJavaObject jo = jc.GetStatic(“currentActivity”); 或者你还可以用 AndroidJavaClass class= new AndroidJavaClass(“com.momo.momo.myclass”); 去取一个类。。

  22. air 说:

    我也遇到这个问题了,跟上面的一样,用的机型是note 3,安卓版本4.3

  23. Will_D 说:

    我用你的程序竖屏是没问题的,换成横屏就出现问题了。不知道你试过没有?

  24. xu转角踩到屎 说:

    你好,我是Android菜菜,这个照片剪切完后,会跳到一个显示界面,按返回键后才返回unity界面。请问我想裁剪保存后就直接跳到unity界面该怎么改?

  25. 你好,我是一个初学者,不知道为什么这个源码一直在我的eclipse和unity里都不能运行,而且在unity里调试的时候,还会显示说Exception: JNI: Init’d AndroidJavaClass with null ptr!这个,研究了好几天实在是不知道为什么,想请教一下原因。。。。。。谢谢

  26. Pingback 引用通告: t裤sasa

  27. 你好 说:

    請問如果我在ASSET STORE下載的PLUGIN已經有ANDROIDMANIFEST, 那麼應該把自己PLUGIN再加上去?

  28. 刘拉拉 说:

    能在Unity3d 调用 ios的相册吗

  29. 雨松MOMO博客网友 说:

    怪摘 . . 不知為何標點符號全不見了 . .

  30. 雨松MOMO博客网友 说:

    MOMO 你好好不容易在台灣這兒買到你的書獲益良多我想問問MOMO 是否有研究過 unity 該如何才能直接使用apple i系列產品的相機鏡頭呢 ??

  31. 匿名 说:

    MOMO 你好好不容易在台灣這兒買到你的書獲益良多我想問問MOMO 是否有研究過 unity 該如何才能直接使用apple i系列產品的相機鏡頭呢 ??

  32. /kf?东风雨 说:

    MOMO你好, 有没有不经过剪辑步骤,直接选择图片并返回到unity项目中, IOS中就是这样实现的, android 多了两步,剪切和返回 才可以回到unity中,我试着修改代码,但是没有成功..android 经验有限.. 求MOMO指点..

  33. /kf 东风雨 说:

    MOMO你好, 有没有不经过剪辑步骤,直接选择图片并返回到unity项目中, IOS中就是这样实现的, android 多了两步,剪切和返回 才可以回到unity中,我试着修改代码,但是没有成功..android 经验有限.. 求MOMO指点..

  34. 雨松MOMO 说:

    我觉得应该是路径的问题吧,你的测试手机是什么? 我用的是nexts

  35. 勿忘我 说:

    我下载了你的这个程序试了一下,发现只要点击保存图片后就会出现弹出框,提示异常报错的错误,这个会是什么回事?

  36. 雨松MOMO 说:

    你测试的手机是哪款?我用的是 谷歌nexus

  37. min 说:

    请问在IOS下怎么实现的

  38. min 说:

    能否交流下在IOS下实现的,我的qq 154908276

  39. 缺氧小老鼠 说:

    MOMO你好,麻烦一下:我在这里 Bitmap photo = extras.getParcelable(“data”);取出来的photo始终是null,不知道是什么原因?查文档看getParcelable(String key)需要提供一个key,不知道这个key(就是那个”data”)是在哪里定义的,是系统的吗?这里有几个错误提示:一个是:Key data excepted Parcelable but value was a java.lang.String.The default value was returned.另一个是(这个就是提示photo是null的那里,主要是extras.getParcelable(“data”)中data的问题导致的):09-20 12:43:46.894: E/AndroidRuntime(29853): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=3, result=-1, data=Intent { dat=content://media/external/images/media/118 (has extras) }} to activity {com.xys/com.xys.WebViewActivity}: java.lang.NullPointerException谢谢解答

  40. kuku小夭 说:

    上面的那句“Unity工程中也需要是这个包名噢” 很微妙,容易让人理解成Unity工程的名字实际上改的是Bundle Identifier(-,-这个翻译过来不是包名的意思吧,唯一的标识符?)

  41. kuku小夭 说:

    MoMo大大 改天要不要研究下如何获取麦克风的 学习学习做一个通过声音来控制的安卓游戏什么的

  42. kuku小夭 说:

    Android的工程我完全没动,我直接用Unity的工程导出成一个安卓程序,一运行就死机=_,=后来我再仔细琢磨了下 原来unity的Bundle Id要设成com.xys,(而不是工程名改成那个运行成功!

  43. kuku小夭 说:

    没深入研究过 顶一个

  44. 于立柱 说:

    你好。可以讲一讲实现扫描二维码的功能么

  45. 刀锋 说:

    最近我也在实现IOS上的这个功能,能把获得的图片保存到沙盒Documents下,但是在程序读的时候总是显示他的默认问号贴图,有几个问题想请教: ① 我在PC上测试“file://D:/test.jpg”得不到图片,file:/D:/test.jpg反倒能得到,我在IOS上测试也发生了这个现象,用file://会直接崩掉,用file:/尽管没有读到图片,但不至于崩掉。去官方Answer上发现还有人建议用file:/// .问题:file:/和file://有什么区别。 ② while (!www.isDone)这一句的作用是什么?

    • 雨松MOMO 说:

      1. File:// 是标准用法, 我没出现过你的情况。 还是说你的图片比较特殊。 2. http://www.isDone 表示 图片是否完成下载, 因为下载是异步 所以 需要在这里等待它下载完成

      • 刀锋 说:

        弄好了,用的file://,问题出在NString和char*的转化上,www.isDone我没有加上去,没看见什么异常。 能写篇文章介绍下内置材质对移动平台的影响就好了,最近发现一些材质在移动平台上耗的厉害。

留下一个回复

你的email不会被公开。