Unity 3 D研究院のカメラを開き、地元のアルバムを切り取って表示する
8723 ワード
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のプラグインメインクラスで、ここでカメラを開くかローカルアルバムを開くかを呼び出す方法です.
そしてWebViewActivity.JAvaでは,主にユーザがカメラやローカルアルバムを開いた後,どのように画像を切り取り,切り取った画像をローカルファイルに格納するかを処理する.
AndroidManifest.xmlというファイルも何も言うことはありませんが、見てみましょう.
そして上のAndroidプロジェクトをパッケージしてプラグインにしてUnityに置きます.下図に示すように、この私のUnityプロジェクトで対応するパスです.
そしてTestを見てcsスクリプトは、カメラに直接掛けられています.
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;
}
}