天天看點

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

}
           

繼續閱讀