参考链接:
打开相机和相册: 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 目录下
然后设置 build.gradle
删除activity_main.xml
删除androidTest和Test
接下来编写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拖出来
Ok,Java方面准备完成
Unity:
创建目录 Plugins/Android 把刚刚Build的classes.jar 拖到该目录下
找到Unity目录下的 AndroidManifest.xml ,把它拖到该目录下
它看起来是这样的
接下来修改 AndroidManifest.xml 文件,如果不知道含义 查阅:https://blog.csdn.net/u012486840/article/details/52468931
编写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
}