Unity 3D 读取android 本地相册打开相机
来源:互联网 发布:mac windows分区减小 编辑:程序博客网 时间:2024/04/30 01:32
最近由于工作需要,研究了关于Unity 调用本地调用手机相册的的功能!在这里我呢呀看了一下momo大神的工程!在工程的基础上进行了改进。momo的工程师在点击手机返回键的时候才能将选择的图片显示在unity 的场景当中!改进之后,就是说直接可以在选中图片之后,就会直接显示在面板当中,这样就更加的符合一个工程的需要。当我们打开相册没有选中图片的时候,然后返回,同样也不会打开android 的activity,同样也会打开unity 的场景,读取指定文件目录下面的图片!
首先新建一个android的工程,然后在unity 的安装目录下面找到classes的一个jar包(找不到查百度),然后导入unity 中,eclipse 邮件 build path Add Ex..选择jar包导入。
新建工程的时候包名称记得和unity 的包名称一样。
然后新建一个webViewActivity 的类。
在主类里面继承UnityPlayerActivity
package com.xys;import android.content.Context;import android.content.Intent;import android.os.Bundle;import com.unity3d.player.UnityPlayerActivity;public class UnityTestActivity extends UnityPlayerActivity {//public class UnityTestActivity extends Activity { Context mContext = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; } //Unity中会调用这个方法,用于区分打开摄像机 开始本地相册 public void TakePhoto(String str) { Intent intent = new Intent(mContext,WebViewActivity.class); intent.putExtra("type", str); this.startActivity(intent); } }
然后是WebViewActivity
package com.xys;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import com.unity3d.player.UnityPlayer;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.view.KeyEvent;import android.widget.ImageView;public class WebViewActivity extends Activity{ ImageView imageView = null; public static final int NONE = 0; public static final int PHOTOHRAPH = 1;// 拍照 public static final int PHOTOZOOM = 2; // 缩放 public static final int PHOTORESOULT = 3;// 结果 public static final String IMAGE_UNSPECIFIED = "image/*"; public final static String FILE_NAME = "image.png"; public final static String DATA_URL = "/data/data/"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); imageView = (ImageView) this.findViewById(R.id.imageID); String type = this.getIntent().getStringExtra("type"); //在这里判断是打开本地相册还是直接照相 if(type.equals("takePhoto")) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp.jpg"))); startActivityForResult(intent, PHOTOHRAPH); }else { Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED); startActivityForResult(intent, PHOTOZOOM); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == NONE) { if(data==null) { this.finish(); UnityPlayer.UnitySendMessage("Main Camera","messgae",FILE_NAME); }else { if(this.isFinishing()==false) { this.finish(); } UnityPlayer.UnitySendMessage("Main Camera","messgae",FILE_NAME); } return; } // 拍照 if (requestCode == PHOTOHRAPH) { //设置文件保存路径这里放在跟目录下 File picture = new File(Environment.getExternalStorageDirectory() + "/temp.jpg"); startPhotoZoom(Uri.fromFile(picture)); } if (data == null) { this.finish(); UnityPlayer.UnitySendMessage("Main Camera","messgae",FILE_NAME); } // 读取相册缩放图片 if (requestCode == PHOTOZOOM) { startPhotoZoom(data.getData()); } // 处理结果 if (requestCode == PHOTORESOULT) { Bundle extras = data.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); imageView.setImageBitmap(photo); try { SaveBitmap(photo); this.finish(); UnityPlayer.UnitySendMessage("Main Camera","messgae",FILE_NAME); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } super.onActivityResult(requestCode, resultCode, data); } public void startPhotoZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, IMAGE_UNSPECIFIED); intent.putExtra("crop", "false"); // 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); } public void SaveBitmap(Bitmap bitmap) throws IOException { FileOutputStream fOut = null; //注解1 String path = "/mnt/sdcard/Android/data/com.xys/files"; try { //查看这个路径是否存在, //如果并没有这个路径, //创建这个路径 File destDir = new File(path); if (!destDir.exists()) { destDir.mkdirs(); } fOut = new FileOutputStream(path + "/" + FILE_NAME) ; } catch (FileNotFoundException e) { e.printStackTrace(); } //将Bitmap对象写入本地路径中,Unity在去相同的路径来读取这个文件 bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut); try { fOut.flush(); } catch (IOException e) { e.printStackTrace(); } try { fOut.close(); } catch (IOException e) { e.printStackTrace(); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK ) { //当用户点击返回键是 通知Unity开始在"/mnt/sdcard/Android/data/com.xys/files";路径中读取图片资源,并且现在在Unity中 UnityPlayer.UnitySendMessage("Main Camera","messgae",FILE_NAME); } return super.onKeyDown(keyCode, event); }}
在android的main,xml布局文件里面放置一个Imageview
andrdoiManifest.xml文件就不说了,有一点android基础应该没有问题。
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xys" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".UnityTestActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".WebViewActivity"> </activity> </application> <!-- 连接互联网的权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- SDCard中创建与删除文件权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- SDCard写入数据权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> </manifest>
完成之后将eclipse 的工程打一个包,很多人不知道这块怎么打包,导出来的包在unity 中不能发布android的工程。首先clean一下工程,然后选中工程,右键,Export JAR file Next
之选中这两个,然后选择保存路径打包就好。
然后将包导入Unity 工程中,如下图、
新建一个test.cs文件,然后给摄像机。就ok了。
下载地址关注我博客
- Unity 3D 读取android 本地相册打开相机
- Android 打开相机,相册
- android 打开相机和相册
- android 打开相机/打开相册(版本兼容)-获取照片,压缩100K一下保存到本地
- Unity调用Android 相机和相册
- Android 调用相机、打开相册、裁剪图片
- cocos android 打开相机,相册并裁剪
- android读取相册照片和相机照片
- 打开相机拍照与 读取背地相册图片
- 打开相机、相册
- iOS 打开相机、相册
- android中打开相机、打开相册进行图片的获取
- Android:读取本地相册与相机获取图片上传到服务器(用字符串的形式上传)
- Unity for iOS 打开相册、相机及保存图片到相册
- 【Ios】 Unity for iOS 打开相册、相机及保存图片到相册
- android中调用系统相机拍照并访问本地相册
- android本地图片选择(相册选取,相机拍摄)
- Android头像上传(本地相册和调用系统相机)
- “杀死”Java线程的一些方法
- fork函数简介
- php 生成加密公钥加密私钥
- 动画view中invalidate()和requestLayout()的生命周期
- Dom4j 解析 XML(Java Api)
- Unity 3D 读取android 本地相册打开相机
- 【shell】找到系统中最大的文件
- 基于二进制的权限判断
- oracle awr详解
- PHP message: PHP Fatal error: Uncaught Error: Class 'Mongo' not found
- CSS3 background-clip 属性
- 洋神的抽奖转盘学习总结
- Android Bitmap 优化- 图片压缩
- 【shell】一些编程的小技巧及sed(未完成)