最近由于工作需要,研究了关于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" />    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> manifest>

完成之后将eclipse 的工程打一个包,很多人不知道这块怎么打包,导出来的包在unity 中不能发布android的工程。首先clean一下工程,然后选中工程,右键,Export JAR file Next
之选中这两个,然后选择保存路径打包就好。
然后将包导入Unity 工程中,如下图、

新建一个test.cs文件,然后给摄像机。就ok了。

下载地址关注我博客

更多相关文章

  1. Android获取不同手机 自身存储和外置SD卡存储路径的解决方案
  2. 微信系列研究之-----资源文件保护的小把戏
  3. Android(安卓)开发技巧-以友盟为例在Android(安卓)Studio利用gra
  4. Android(安卓)使用腾讯的TBS浏览器X5内核的集成加载pdf等文件
  5. 别让Android(安卓)Studio占据你的C盘
  6. Android入门教程(六)之------拿来主义.apk文件的反编译
  7. gradle教程 [原创](eclipse/ADT下 非插件 非Android(安卓)Studio/
  8. [置顶] Android中获取缓存大小和清除缓存功能
  9. android usb挂载分析--各种格式支持

随机推荐

  1. Android: requires android.permission.R
  2. Android 自动化测试—robotium(三)EditText
  3. 【Android】图文解密Android WindowManag
  4. Android 保存和恢复activity的状态数据
  5. Android编译系统中的Android.bp、Bluepri
  6. Mac 下 Android Studio 获取SHA1 码
  7. Android相机开发中遇到的坑(注意事项)
  8. Android之Telephony各文件解释
  9. adb shell
  10. Android Screen Monitor使用