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

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

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

C#

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

packagecom.xys;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.os.Bundle;

importcom.unity3d.player.UnityPlayerActivity;

publicclassUnityTestActivityextendsUnityPlayerActivity{

//public class UnityTestActivity extends Activity {

ContextmContext=null;

@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

mContext=this;

}

//Unity中会调用这个方法,用于区分打开摄像机 开始本地相册

publicvoidTakePhoto(Stringstr)

{

Intentintent=newIntent(mContext,WebViewActivity.class);

intent.putExtra("type",str);

this.startActivity(intent);

}

}

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

C#

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

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

packagecom.xys;

importjava.io.File;

importjava.io.FileNotFoundException;

importjava.io.FileOutputStream;

importjava.io.IOException;

importcom.unity3d.player.UnityPlayer;

importandroid.app.Activity;

importandroid.content.Intent;

importandroid.graphics.Bitmap;

importandroid.net.Uri;

importandroid.os.Bundle;

importandroid.os.Environment;

importandroid.provider.MediaStore;

importandroid.view.KeyEvent;

importandroid.widget.ImageView;

publicclassWebViewActivityextendsActivity

{

ImageViewimageView=null;

publicstaticfinalintNONE=0;

publicstaticfinalintPHOTOHRAPH=1;// 拍照

publicstaticfinalintPHOTOZOOM=2;// 缩放

publicstaticfinalintPHOTORESOULT=3;// 结果

publicstaticfinalStringIMAGE_UNSPECIFIED="image/*";

publicfinalstaticStringFILE_NAME="image.png";

publicfinalstaticStringDATA_URL="/data/data/";

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

imageView=(ImageView)this.findViewById(R.id.imageID);

Stringtype=this.getIntent().getStringExtra("type");

//在这里判断是打开本地相册还是直接照相

if(type.equals("takePhoto"))

{

Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);

intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(newFile(Environment.getExternalStorageDirectory(),"temp.jpg")));

startActivityForResult(intent,PHOTOHRAPH);

}else

{

Intentintent=newIntent(Intent.ACTION_PICK,null);

intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,IMAGE_UNSPECIFIED);

startActivityForResult(intent,PHOTOZOOM);

}

}

@Override

protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){

if(resultCode==NONE)

return;

// 拍照

if(requestCode==PHOTOHRAPH){

//设置文件保存路径这里放在跟目录下

Filepicture=newFile(Environment.getExternalStorageDirectory()+"/temp.jpg");

startPhotoZoom(Uri.fromFile(picture));

}

if(data==null)

return;

// 读取相册缩放图片

if(requestCode==PHOTOZOOM){

startPhotoZoom(data.getData());

}

// 处理结果

if(requestCode==PHOTORESOULT){

Bundleextras=data.getExtras();

if(extras!=null){

Bitmapphoto=extras.getParcelable("data");

imageView.setImageBitmap(photo);

try{

SaveBitmap(photo);

}catch(IOExceptione){

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

super.onActivityResult(requestCode,resultCode,data);

}

publicvoidstartPhotoZoom(Uriuri){

Intentintent=newIntent("com.android.camera.action.CROP");

intent.setDataAndType(uri,IMAGE_UNSPECIFIED);

intent.putExtra("crop","true");

// aspectX aspectY 是宽高的比例

intent.putExtra("aspectX",1);

intent.putExtra("aspectY",1);

// outputX outputY 是裁剪图片宽高

intent.putExtra("outputX",300);

intent.putExtra("outputY",300);

intent.putExtra("return-data",true);

startActivityForResult(intent,PHOTORESOULT);

}

publicvoidSaveBitmap(Bitmapbitmap)throwsIOException{

FileOutputStreamfOut=null;

//注解1

Stringpath="/mnt/sdcard/Android/data/com.xys/files";

try{

//查看这个路径是否存在,

//如果并没有这个路径,

//创建这个路径

FiledestDir=newFile(path);

if(!destDir.exists())

{

destDir.mkdirs();

}

fOut=newFileOutputStream(path+"/"+FILE_NAME);

}catch(FileNotFoundExceptione){

e.printStackTrace();

}

//将Bitmap对象写入本地路径中,Unity在去相同的路径来读取这个文件

bitmap.compress(Bitmap.CompressFormat.PNG,100,fOut);

try{

fOut.flush();

}catch(IOExceptione){

e.printStackTrace();

}

try{

fOut.close();

}catch(IOExceptione){

e.printStackTrace();

}

}

@Override

publicbooleanonKeyDown(intkeyCode,KeyEventevent)

{

if(keyCode==KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0)

{

//当用户点击返回键是 通知Unity开始在"/mnt/sdcard/Android/data/com.xys/files";路径中读取图片资源,并且现在在Unity中

UnityPlayer.UnitySendMessage("Main Camera","message",FILE_NAME);

}

returnsuper.onKeyDown(keyCode,event);

}

}

注解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中。

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

C#

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

package="com.xys"

android:versionCode="1"

android:versionName="1.0">

android:icon="@drawable/ic_launcher"

android:label="@string/app_name">

android:name=".UnityTestActivity"

android:label="@string/app_name">

android:name=".WebViewActivity">

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

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

C#

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

usingUnityEngine;

usingSystem.Collections;

usingSystem.IO;

publicclassTest:MonoBehaviour

{

publicGUISkinskin;

Texturetexture;

voidUpdate()

{

if(Input.GetKeyDown(KeyCode.Escape)||Input.GetKeyDown(KeyCode.Home))

{

Application.Quit();

}

}

voidOnGUI()

{

GUI.skin=skin;

if(GUILayout.Button("打开手机相册"))

{

//调用我们制作的Android插件打开手机相册

AndroidJavaClassjc=newAndroidJavaClass("com.unity3d.player.UnityPlayer");

AndroidJavaObjectjo=jc.GetStatic("currentActivity");

jo.Call("TakePhoto","takeSave");

}

if(GUILayout.Button("打开手机摄像机"))

{

//调用我们制作的Android插件打开手机摄像机

AndroidJavaClassjc=newAndroidJavaClass("com.unity3d.player.UnityPlayer");

AndroidJavaObjectjo=jc.GetStatic("currentActivity");

jo.Call("TakePhoto","takePhoto");

}

if(texture!=null)

{

//注意! 我们在这里绘制Texture对象,该对象是通过

//我们制作的Android插件得到的,当这个对象不等于空的时候

//直接绘制。

GUI.DrawTexture(newRect(100,300,300,300),texture);

}

}

voidmessgae(stringstr)

{

//在Android插件中通知Unity开始去指定路径中找图片资源

StartCoroutine(LoadTexture(str));

}

IEnumeratorLoadTexture(stringname)

{

//注解1

stringpath="file://"+Application.persistentDataPath+"/"+name;

WWWwww=newWWW(path);

while(!www.isDone)

{

}

yieldreturnwww;

//为贴图赋值

texture=www.texture;

}

}

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

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

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

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

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

如果点击打开摄像机按钮,拍照完毕后会提示裁剪,裁减完毕返回到Unity界面中同样能看到效果。

最后MOMO将本篇博文的源码放出来,  源码包括Android的工程 与Unity的工程,雨松MOMO祝大家学习愉快,大家互相学习互相进步,加油哇咔咔,啦啦啦。

最后编辑:2015-07-03作者:雨松MOMO

专注移动互联网,Unity3D游戏开发

捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

unity 启动相机_Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三)...相关推荐

  1. IOS研究院之打开照相机与本地相册选择图片

    如下图所示 在本地相册中选择一张图片后,我们将他拷贝至沙盒当中,在客户端中将它的缩略图放在按钮旁边,这个结构其实和新浪微薄中选择图片后的效果一样.最终点击发送将按钮将图片2进制图片上传服务器. 下面我 ...

  2. iOS打开照相机与本地相册选择图片

    最近正好项目里面要集成"打开照相机与本地相册选择图片"的功能,今天就在这边给大家写一个演示程序:打开相机拍摄后或者在相册中选择一张照片,然后将它显示在界面上.好了废话不多说,因为比 ...

  3. iOS 打开照相机与本地相册选择图片

    最近正好项目里面要集成"打开照相机与本地相册选择图片"的功能,今天就在这边给大家写一个演示程序:打开相机拍摄后或者在相册中选择一张照片,然后将它显示在界面上.好了废话不多说,因为比 ...

  4. unity 启动相机_Unity3D实现相机跟随控制

    本文实例为大家分享了Unity3D实现相机跟随控制的具体代码,供大家参考,具体内容如下 跟随算法 要实现3D摄像机的控制第一步就是先实现摄像机跟随物体移动. 要想让相机跟随物体移动,就要明白在一定角度 ...

  5. iOS-打开照相机打开本地相册图片上传

    ResourceFrom:http://www.xuanyusong.com/archives/1493 Hello 大家好 IOS的文章好久都木有更新了,今天更新一篇哈. 这篇文章主要学习如何在IO ...

  6. ugui 转轮_Unity3D研究院之Android NDK编译C/C++结合Unity实现本地数据共享(二十八)...

    开始本篇文章之前我先为大家简单的介绍一下Android NDK编程的原理, 我们知道Android开发使用JAVA语言来编程它的运行效率要比C/C++低很多,为了让JAVA语言可以调用 C/C++ 这 ...

  7. win7的计算机功能在那打开,win7系统照相机功能在哪?win7系统打开照相机功能的方法...

    win7系统自带有照相机功能,之前xp系统打开硬盘符下面有一个摄像头快捷方式,直接点击就可以照相了.那么升级到win7纯净版系统后却找不到照相机功能了,那么win7系统照相机功能在哪?大家可以从程序里 ...

  8. Android基础知识复习之打开照相机拍照并获取照片

    对于我来说,做一件事情: 首先要理清我的思路,我要打开照相机,我能想到的是:在Android中我要打开系统应用,肯定需要一个隐式意图,那就要查询Android照相机的源码,查看并找到意图过滤器的书写方 ...

  9. AS打开照相机拍照保存本地、显示页面

    打开相机 1.权限 6.0之后修改动态获取权限 打开照相机的权限 <uses-permission android:name="android.permission.CAMERA&qu ...

最新文章

  1. numpy找到数组中符合条件的数
  2. make for arm
  3. 《Web项目实践》实验报告——Web项目实践基础
  4. 发电厂电气部分第三版pdf_火力发电厂电气主接线的特点
  5. C# 实现将文本txt生成图片
  6. 外贸人不知道的Facebook广告营销技巧和营销工具
  7. 评:网瘾不是问题 两代人文化冲突是根本
  8. 音箱箱体的分类(四)
  9. QT驾校科目考试系统——从实现到发布
  10. 第三章 面向对象(上)
  11. springboot中ElasticSearch入门与进阶:组合查询、聚合查询
  12. javascript 中的纯函数
  13. sqlserver 与access,excel互相导入导出代码
  14. DTOJ3702 月读(tsukuyomi)
  15. 【C语言】队列的实现
  16. 全球及中国普瑞巴林API行业竞争格局分析与发展方向预测报告2022-2028年
  17. 软件工程导论的开发可行性研究
  18. 第十九章 文本处理流编辑器:awk编程
  19. python中input的意思_python中input指的是什么意思
  20. 今天打开抖音就有惊喜了

热门文章

  1. 为什么声明性编码使您成为更好的程序员
  2. 线程,代码和数据–多线程Java程序实际运行的方式
  3. 6个您需要了解的日志管理工具(以及如何使用它们)
  4. how2java_HOW-TO:在Spring 4和Java 7中使用@PropertySource批注
  5. java 语义_Java文件合并变得语义化
  6. java检查注入sql框架_Java:检查器框架
  7. 部署微服务– Spring Boot fatjar到Amazon Elastic Beanstalk
  8. 依赖注入通俗解释_我如何向团队解释依赖注入
  9. JavaFX实际应用程序:AISO HRC-Matic
  10. appengine_Google Appengine登台服务器操作方法