天天看点

Unity与安卓交互之拍照与相册参考链接:

参考链接:

打开相机和相册:  https://blog.csdn.net/ak4100/article/details/52933923

java回调unity: http://www.manew.com/thread-101810-1-1.html

交互: https://blog.csdn.net/luoyikun/article/details/72760567

准备环境,我的是unity4.7.1 和 AndroidStudio

首先导入unity目录的 classes.jar 包到 AndroidStudio的 libs 目录下

Unity与安卓交互之拍照与相册参考链接:

然后设置 build.gradle

Unity与安卓交互之拍照与相册参考链接:

删除activity_main.xml 

删除androidTest和Test 

Unity与安卓交互之拍照与相册参考链接:

接下来编写java代码,先来一个事件接口

package com.example.pc.myapplication;

public interface UnityListener {
    public void OnVoid(int errorCode);
    public void OnBool(int errorCode, Boolean value);
    public void OnInt(int errorCode, int value);
    public void OnLong(int errorCode, Long value);
    public void OnShort(int errorCode, short value);
    public void OnFloat(int errorCode, float value);
    public void OnDouble(int errorCode, double value);
    public void OnChar(int errorCode, char value);
    public void OnByte(int errorCode, byte value);
    public void OnString(int errorCode, String value);
    public void OnObject(int errorCode, Object value);

}
           

然后,编写打开相机和相册的代码

package com.example.pc.myapplication;

import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;

import java.io.File;

public class MainActivity extends UnityPlayerActivity {

    private static final String TAG = MainActivity.class.getSimpleName();
    private static final int PHOTO_REQUEST_CODE = 1;//相册
    public static final int PHOTOHRAPH = 2;// 拍照
    public static final int NONE = 0;

    private  String takephotoPath;
    private UnityListener listener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }


    public  void setUnityActivityListener(UnityListener listener){
        this.listener = listener;
    }

    //调用相机
    public void Takephoto(String path,String name){
        takephotoPath = Environment.getExternalStorageDirectory()+path+"/"+name+".jpg";
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory()+path, name+".jpg")));
        startActivityForResult(intent, PHOTOHRAPH);

    }

    //调用相册
    public void OpenGallery()
    {
        Intent intent = new Intent(Intent.ACTION_PICK,null);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
        startActivityForResult(intent, PHOTO_REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == NONE){
            return;
        }
        if(PHOTO_REQUEST_CODE == requestCode){
            if(data == null){
                return;
            }
            Uri uri = data.getData();
            String imagePath = getImagePath(uri);
            listener.OnString(resultCode,imagePath);
        }
        if(requestCode == PHOTOHRAPH)
        {
            listener.OnString(resultCode,takephotoPath);
        }
    }

    private String getImagePath(Uri uri)
    {
        if(null == uri) return null;
        String path = null;
        final String scheme = uri.getScheme();
        if (null == scheme) {
            path = uri.getPath();
        } else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
            path = uri.getPath();
        } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
            String[] proj = { MediaStore.Images.Media.DATA };
            Cursor cursor = getContentResolver().query(uri, proj, null, null,
                    null);
            int nPhotoColumn = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            if (null != cursor) {
                cursor.moveToFirst();
                path = cursor.getString(nPhotoColumn);
            }
            cursor.close();
        }
        return path;
    }
}
           

然后就可以build了。。。通过之后找到app-debug.arr文件,使用压缩方式打开,把里面的classes.jar拖出来

Unity与安卓交互之拍照与相册参考链接:

Ok,Java方面准备完成

Unity:

创建目录 Plugins/Android 把刚刚Build的classes.jar 拖到该目录下

找到Unity目录下的 AndroidManifest.xml ,把它拖到该目录下

Unity与安卓交互之拍照与相册参考链接:

它看起来是这样的

Unity与安卓交互之拍照与相册参考链接:

接下来修改 AndroidManifest.xml 文件,如果不知道含义 查阅:https://blog.csdn.net/u012486840/article/details/52468931

Unity与安卓交互之拍照与相册参考链接:

编写java对应的unity事件类

using UnityEngine;
using System.Collections;


public class UnityActivityProxy : AndroidJavaProxy
{
    public delegate void VoidEvent();
    public delegate void LongEvent(long value);
    public delegate void IntEvent( int value);
    public delegate void DoubleEvent( double value);
    public delegate void StringEvent( string value);

    public event LongEvent onLong;
    public event IntEvent onInt;
    public event DoubleEvent onDouble;
    public event StringEvent onString;
    public event VoidEvent onError;

    public UnityActivityProxy() : base("com.example.pc.myapplication.UnityListener") { }

    public void OnLong(int errorCode, long value) {
        if (Inspect(errorCode))
        {
            if (onLong != null) onLong(value);
        }
    }
    public void OnInt(int errorCode, int value) {
        if (Inspect(errorCode))
        {
            if (onInt != null) onInt(value);
        }
    }
    public void OnDouble(int errorCode, double value) {
        if (Inspect(errorCode))
        {
            if (onDouble != null) onDouble(value);
        }
    }
    public void OnString(int errorCode, string value) {
        if (Inspect(errorCode))
        {
            if (onString != null) onString(value);
        }
    }

    bool Inspect(int errorCode)
    {
        if(errorCode == -1)
        {
            return true;
        }
        else
        {
            if (onError != null) onError();
            return false;
        }
    }
}
           

然后就可以打开相机和相册啦

using UnityEngine;
using System.Collections;
using System.Text.RegularExpressions;

public class NewBehaviourScript : MonoBehaviour {

#if UNITY_ANDROID
    AndroidJavaObject current;
    void Start()
    {

        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        current = jc.GetStatic<AndroidJavaObject>("currentActivity");

        UnityActivityProxy listener = new UnityActivityProxy();
        listener.onString += obj => {
            Debug.Log(obj);
        };
        listener.onError += () => {
            Debug.Log("错误");
        };
        current.Call("setUnityActivityListener", listener);
    }
    
    public void OpenPhoto()
    {
        current.Call("OpenGallery");
    }

    public void OpenCamera()
    {
        //函数默认SDK目录+应用目录+文件名+.jpg
        current.Call("Takephoto", "/Android/data/"+ Regex.Match(Application.persistentDataPath, "(com.*)"),"666");
    }
#endif

}
           

继续阅读