Entorno de desarrollo:
Estudio Android 3.5.2
Unity3d 2020.3.25f1c1
Tabla de contenido
2. Cree un nuevo módulo y asígnele el nombre de prueba
3. Elimine la aplicación Moudle redundante creada por defecto
4. Importe el archivo classes.jar de Unity3d
5. Importar UnityPlayerActivity.java de Unity3d
8. Configuración de Android MainFest
Código fuente completo del proyecto
Sección de estudio de Android
1. Crear nuevo proyecto
Crear nuevo proyecto, actividad vacía, paquete com.example.unity2photo
2. Cree un nuevo módulo y asígnele el nombre de prueba
Cambie a Proyecto, Nuevo - Módulo, Biblioteca de Android y haga clic en Siguiente.
3. Elimine la aplicación Moudle redundante creada por defecto
Abra la Configuración del módulo, seleccione el número de punto de la aplicación, Sí, luego Eliminar.
4. Importe el archivo classes.jar de Unity3d
La ubicación correspondiente debajo de la ruta de instalación de Unity3d:
D:\Software\Unity\2020.3.25f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes
Copie class.jar y péguelo en el directorio libs, haga clic con el botón derecho en classer.jar - Agregar como biblioteca
5. Importar UnityPlayerActivity.java de Unity3d
D:\Software\Unity\2020.3.25f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player
Copie UnityPlayerActivity.java y péguelo en src - main- java - com.example.test
6. Crear actividad principal
Haga clic derecho en com.example.test, New –Activity – Empty Activity
7. Parte del código Java
package com.example.test;
import android.Manifest;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.unity_player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity{
// @Override
// protected void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
// }
// @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 获取存储权限,不然的话无法获取图片
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 100);
}
}
// unity点击按钮触发这个方法
public void startPhoto() {
Log.d("unity","打开相册");
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 111); // 第二个参数是请求码
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case 111: // 请求码
Log.d("Unity", "相册返回");
UnityPlayer.UnitySendMessage("Main Camera", "message", parseUri(data));
Log.d("unity", parseUri(data));
break;
}
}
}
public String parseUri(Intent data) {
Uri uri = data.getData();
String imagePath;
// 第二个参数是想要获取的数据
Cursor cursor = getContentResolver()
.query(uri, new String[]{MediaStore.Images.ImageColumns.DATA},
null, null, null);
if (cursor == null) {
imagePath = uri.getPath();
} else {
cursor.moveToFirst();
// 获取数据所在的列下标
int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
imagePath = cursor.getString(index); // 获取指定列的数据
cursor.close();
}
return imagePath; // 返回图片地址
}
}
8. Configuración de Android MainFest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test"
android:versionCode="1"
android:versionName="1.0" >
<application>
<activity android:name="com.example.test.MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
9. Construir Android aar
10. Importar Unity3d
Empaquete y cree test_debug.arr, descomprima classes.jar para reemplazar libs classes.jar y luego comprima en test_debug.arr
Complementos - Android - AndroidMainfest.xml
Complementos - Android - test_debug.arr
Parte del código Unity3d
2 maneras de leer imágenes
1,TexturaUnityWebRequest
2. Use el flujo de archivos para leer imágenes
void CallAndroid()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("startPhoto");
Debug.Log("点击按钮");
}
public void message(string str)
{
ShowImage(str);
Debug.Log("安卓传来信息:" + str);
//StartCoroutine(LoadTexturePreview("file://" + str));
}
//使用UnityWebRequestTexture读取图片
IEnumerator LoadTexturePreview(string path)
{
UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(path);
yield return uwr.SendWebRequest();
Debug.Log("图片地址:" + path);
if (uwr.isNetworkError || uwr.isHttpError)
{
Debug.Log("错误" + uwr.error);
}
else
{
Texture2D texture = DownloadHandlerTexture.GetContent(uwr);
// 图片显示在按钮上
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(.5f, .5f));
ImageView.sprite = sprite;
}
}
//使用文件流读取图片
private void ShowImage(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, (int)bye.Length);
fileStream.Close();
fileStream.Dispose();
fileStream = null;
Texture2D texture = new Texture2D(100, 50);
texture.LoadImage(bye);
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
ImageView.sprite = sprite;
}
exhibición final
Código fuente completo del proyecto
Incluye: Unity3d lee el álbum de fotos del teléfono móvil, Unity abre la cámara del teléfono móvil, guarda imágenes, etc.
expandir
Error de paquete de APK
Solución:
El classpath en build.gralde se refiere a la versión del complemento gradle de Android Studio.
'com.android.tools.build:gradle:3.5.2'
¡Y la distribuciónUrl en gradle-wrapper.properties es la versión de gradle especificada!
distribuciónUrl = https \: //services.gradle.org/distributions/gradle-5.4.1-all.zip
Gradle es una herramienta de compilación automatizada de código abierto, y el complemento de Gradle es un complemento desarrollado por Google para usar Gradle en Android Studio.
URL de referencia:
Compilación de Unity Gradle
Unity Gradle Build - Libro breve
Intención.ACTION_PICK
Intent.ACTION_PICK - El tiempo es justo, - Blog Garden
Empaquetado automático de Unity - Android Studio - explicación detallada de build.gradle
Unity Automatic Packaging-Android Studio-build.gradle Explicación detallada- Programador buscado