• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

Unity3D 读取Android 本地相册打开相机

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2018/1025/131.html

Unity3D 读取Android 本地相册打开相机

 

因为工作需要,研究了关于Unity调用本地调用手机相册的的功能!在这里我们常州手机App游戏开发培训专家幻天网络先看了一下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);

   

androidmain,xml布局文件里面放置一个Imageview

<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文件,然后给摄像机,就可以了。

 



上篇:上一篇:Unity3d Inspector面板实现set/get访问器
下篇:下一篇:U3D 设置纹理缩放