Unity3d lee el álbum de fotos del teléfono Android

Entorno de desarrollo:

Estudio Android 3.5.2

Unity3d 2020.3.25f1c1

Tabla de contenido

Sección de estudio de Android

1. Crear nuevo proyecto 

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

6. Crear actividad principal

7. Parte del código Java

8. Configuración de Android MainFest

9. Construir Android aar

10. Importar Unity3d

Parte del código Unity3d

exhibición final

Código fuente completo del proyecto

expandir


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

Unity3d abre un ejemplo de proyecto completo de álbum de teléfono móvil-Recursos de documentación de Unity3D-Descarga de CSDN

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:

Interacción simple entre Unity y Android, Unity abre el álbum de fotos de Android y lo llama (después de Unity2019)

Compilación de Unity Gradle

Android Studio informó un error: Error: no se pudo encontrar com.android.tools.build:gradle:4.1 Recuerde un hoyo con poca memoria_Blog de LittleFogCat-CSDN Blog

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

Supongo que te gusta

Origin blog.csdn.net/m1234567q/article/details/124864866
Recomendado
Clasificación