Unity 3 D研究院のカメラを開き、地元のアルバムを切り取って表示する


Unity 3 D研究院のカメラを開き、地元のアルバムを切り取って表示する
UnityとAndroidのインタラクションができない方はMOMOの前の文章をご覧くださいね.Unity 3 D研究院のActivityとJAVAコード伝達パラメータの呼び出し(18)ここでインタラクションの仕方について詳しく説明しません.主にUnityでカメラを開き、Unityでローカルアルバムを開き、写真を選んでどのようにカットし、最後に画像をTextureに変換してU 3 Dの世界に表示します.
まずEclipseのAndroidプラグインの部分を見てみましょう.私のパッケージ名はcomです.xysはMOMOと一致してください.Unityプロジェクトでもこのパッケージ名が必要ですよ.
UnityTestActivity.JAvaというクラスはUnityのプラグインメインクラスで、ここでカメラを開くかローカルアルバムを開くかを呼び出す方法です.
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.JAvaでは,主にユーザがカメラやローカルアルバムを開いた後,どのように画像を切り取り,切り取った画像をローカルファイルに格納するかを処理する.
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)
            return;
        //   
        if (requestCode == PHOTOHRAPH) {
            //                
            File picture = new File(Environment.getExternalStorageDirectory() + "/temp.jpg");
            startPhotoZoom(Uri.fromFile(picture));
        }  
 
        if (data == null)
            return;  
 
        //         
        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);
				} 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", "true");
        // 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 && event.getRepeatCount() == 0)
		{
			   //            Unity   "/mnt/sdcard/Android/data/com.xys/files";         ,     Unity 
			   UnityPlayer.UnitySendMessage("Main Camera","message",FILE_NAME);
 
		}
		return super.onKeyDown(keyCode, event);
	}
}

AndroidManifest.xmlというファイルも何も言うことはありませんが、見てみましょう.


 
    
 
    
        
            
                
 
                
            
        
 
       
        
    
 
    
    
    




そして上のAndroidプロジェクトをパッケージしてプラグインにしてUnityに置きます.下図に示すように、この私のUnityプロジェクトで対応するパスです.
 
そしてTestを見てcsスクリプトは、カメラに直接掛けられています.
using UnityEngine;
using System.Collections;
using System.IO;
 
public class Test : MonoBehaviour
{
	public GUISkin skin;
	Texture texture;
 
	void Update ()
	{
 
		if (Input.GetKeyDown(KeyCode.Escape) || Input.GetKeyDown(KeyCode.Home))
  		{
   			Application.Quit();
  		}
	}
 
	void OnGUI()
	{
		 GUI.skin = skin;
 
		if(GUILayout.Button("      "))
		{
			 //       Android        
			 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
      	 	 AndroidJavaObject jo = jc.GetStatic("currentActivity");
        	 jo.Call("TakePhoto","takeSave");
 
		}
		if(GUILayout.Button("       "))
		{
			 //       Android         
			 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
      	 	 AndroidJavaObject jo = jc.GetStatic("currentActivity");
        	 jo.Call("TakePhoto","takePhoto");
 
		}
		if(texture != null)
		{
			//  !        Texture  ,      
			//     Android     ,            
			//    。
			GUI.DrawTexture(new Rect(100,300,300,300),texture);
		}
	}
 
	void  messgae(string str)
	{
		// Android     Unity             
		StartCoroutine(LoadTexture(str));
 
	}
 
  IEnumerator LoadTexture(string name)
  {
	//  1
	string path  =  "file://" + Application.persistentDataPath +"/" + name;
 
	WWW www = new WWW(path);
	while (!www.isDone)
	{
 
	}
	yield return www;
	//     
	texture = www.texture;
  }
}