admin 管理员组文章数量: 887016
1.配置unity的sdk,jdk
2.下载Android stdio
3.编写插件
4.导入插件
5.unity调用
6.打包运行
1.sdk、jdk
网上教程多的是,这里不再赘述,但是需要注意的是,在安装sdk的时候,你所安装的 SDKPlatform 的API,要和Android SDK Build-tools相匹配,不然 会报错。如下
2.Android studio 下载与安装自行搜索百度
3.插件编写
开始最重要的插件的编写,这里我们要做的是jar包
1.在Android stdio 中新建一个空项目,有两个需要注意的地方,如下
包名必须与unity工程中的包名一样,最低使用的API等级也要已知,否则unity打包出来的apk会闪退,当然还有可能有其他的导致闪退的原因,可以自行上网去查。
2.在MainAcitivy中将一下代码复制进去,注意包名要使用你自己的
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity{
private static String LOG_TAG = "LOG_My";
Context mContext = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
}
//Unity中会调用这个方法,用于打开本地相册
public void TakePhoto(String str)
{
Log.d(LOG_TAG,str);
Intent intent = new Intent(mContext,WebViewActivity.class);
this.startActivity(intent);
}
}
复制编译之后,会有报错,先不管,如果是第一次使用android stdio的人,可能找不到这个MainAcitivy,在Android stdio的左上角有一个切换视图,切换到 Android视图,一般在java下面
3.导入unity的classes.jar
这个jar包一般在你unity的安装目录下面,需要注意的是,你项目使用的是那个版本,那你就要导入那个版本的classes.jar
路径一般为:unity->Editor->Data->PlaybackEngines->AndroidPlayer->Varations->momo->Release->classes;
找到这个classes.jar之后,将其复制一份,粘贴到刚才的android项目中的app/lib文件夹中,并且讲起添加(右键,add as library,添加之后会弹出提示,确定是app就好了)
原因:android需要和unity进行交互,那么就要调用unity的类才行
4.在MainActivity下面创建新的类,命名为 WebViewActivity
将一下代码复制进去,注意包名要用自己的
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.KeyEvent;
import com.unity3d.player.UnityPlayer;
import java.io.IOException;
public class WebViewActivity extends Activity
{
public static final int NONE = 0;
public static final int PHOTORESOULT = 3;
public static final String IMAGE_UNSPECIFIED = "image/*";
private String LOG_TAG = "LOG_ZDQ";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);
startActivityForResult(intent, PHOTORESOULT);
Log.d(LOG_TAG, "打开相册!");
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(LOG_TAG, "resultCode :" + resultCode);
if (resultCode == NONE)
return;
if (data == null)
return;
ContentResolver resolver = getContentResolver();
Bitmap bm=null;
Uri originalUri = data.getData();
try {
bm = MediaStore.Images.Media.getBitmap(resolver, originalUri);
} catch (IOException e) {
e.printStackTrace();
}
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor= getContentResolver().query(originalUri,proj,null,null,null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String _path = cursor.getString(column_index);
UnityPlayer.UnitySendMessage("Main Camera", "GetPhoto", _path);
super.onActivityResult(requestCode, resultCode, data);
this.finish();
}
}
需要注意的地方有一点:在打成jar包之前,你首先要确定,你这个打开手机相册的方法到底是在那个物体上在这里我给的是Maincamera,然后调用的是getphoto,传过去的参数是你选择的图片的路径
5.打包准备:
新建一个module-》Android Library 里面的设置要和上面的一样
然后将前面写的两个脚本放在新建的module同样的位置,再将classes.jar也复制到module的lib里面 ,add as library,注意包名!
编辑一下 module的 Androidmanifest.xml文件复制一下代码
<manifest xmlns:android="http://schemas.android/apk/res/android"
package="com.NXNC.Farm" >
<!--读取相册权限 (必须)-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application >
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".WebViewActivity">
</activity>
</application>
</manifest>
注意包名要是自己的
在build.gradle中加上代码,注意不是直接覆盖原本的代码,是追加:
task makejar(type: Copy){
delete 'libs/test.jar'
from('build/intermediates/packaged-classes/release/')
into('libs')
include('classes.jar')
rename('classes.jar','FarmGetAndroidPhoto.jar')
}
makejar.dependsOn(build)
6.打包建议:
在android stdio安装目录下面找到studio.exe.vmoptions ,看看是64位的还是32位的,不管是那个,有那个就编辑那个,修改里面的相应内容,不是全部,不是全部
-Xms2048m
-Xmx2048m
-XX:ReservedCodeCacheSize-2048m
gradle.properties注释到这句话:
就是在前面加一个#
7.正式打包!
在terminal中输入gradlew makehar
如果成功,会提示build successful
切换到project视图,在新建的module的libs中会有心的jar
在导入插件之前,先用压缩包打开生成的jar,将里面的buildCofig.class删除,原因是unity在使用插件打包的时候,也会生成这个文件,为了避免不必要的错误,直接删掉jar里面的这个;
4.导入插件
在unity工程里面的Asset 中新建文件夹Plugins-Android
Plugins 文件夹是专门用来放unity所使用的插件的,Android这个子文件夹是用来确定放什么引擎写出的插件的
5.unity调用
using UnityEngine;
using System.IO;
using UnityEngine.UI;
public class GetAndroidPhoto : MonoBehaviour
{
public Button button;
public RawImage rawImage;
void Start ()
{
button.onClick.AddListener(OpenLibery);
}
private void OpenLibery()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("TakePhoto", Application.persistentDataPath);
}
public void GetPhoto(string path)
{
Debug.Log("android give path ==> " + path);
FileGetTex(path);
}
private void FileGetTex(string path)
{
FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
fileStream.Seek(0, SeekOrigin.Begin);
byte[] bye = new byte[fileStream.Length];
fileStream.Read(bye, 0, bye.Length);
fileStream.Close();
Texture2D texture2D = new Texture2D((int)rawImage.rectTransform.rect.width, (int)rawImage.rectTransform.rect.height);
texture2D.LoadImage(bye);
rawImage.texture = texture2D;
}
}
6.打包
注意包名与android stdio中的包名的一致性,不要用interal!要用Gradle,原因是因为我们要和Android系统做交互,就要用这个
然后就能正确的运行demo了
版权声明:本文标题:unity 通过安卓制作的插件打开手机相册与选择图片 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1726384902h949893.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论