Unity3d liest das Fotoalbum des Android-Telefons

Entwicklungsumgebung:

Android-Studio 3.5.2

Unity3d 2020.3.25f1c1

Inhaltsverzeichnis

Abschnitt Android Studio

1. Neues Projekt erstellen 

2. Erstellen Sie ein neues Modul und nennen Sie es Test

3. Löschen Sie die redundante Moudle-App, die standardmäßig erstellt wurde

4. Importieren Sie dieclasses.jar von Unity3d

5. Importieren Sie UnityPlayerActivity.java von Unity3d

6. Hauptaktivität erstellen

7. Java-Codeteil

8. AndroidMainFest-Konfiguration

9. Android-Build aar

10. Importieren Sie Unity3d

Unity3d-Codeteil

endgültige Anzeige

Vollständiger Quellcode des Projekts

expandieren


Abschnitt Android Studio

1. Neues Projekt erstellen 

Create New Project , Empty Activity , Paket com.example.unity2photo

2. Erstellen Sie ein neues Modul und nennen Sie es Test

Wechseln Sie zu Project, New - Module, Android Library und klicken Sie auf Next.

3. Löschen Sie die redundante Moudle-App, die standardmäßig erstellt wurde

Öffnen Sie die Moduleinstellungen, wählen Sie die APP-Punktnummer, Ja und dann Löschen.

4. Importieren Sie dieclasses.jar von Unity3d

Der entsprechende Speicherort unterhalb des Unity3d-Installationspfads:

D:\Software\Unity\2020.3.25f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes

Kopieren Sie class.jar und fügen Sie es im Verzeichnis libs ein, klicken Sie mit der rechten Maustaste auf classer.jar - Add As Library

5. Importieren Sie UnityPlayerActivity.java von Unity3d

D:\Software\Unity\2020.3.25f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player

 Kopieren Sie UnityPlayerActivity.java und fügen Sie es unter src - main-java - com.example.test ein

6. Hauptaktivität erstellen

Klicken Sie mit der rechten Maustaste auf com.example.test, New –Activity – Empty Activity

7. Java-Codeteil

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. AndroidMainFest-Konfiguration

<?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. Android-Build aar

10. Importieren Sie Unity3d

Packen und erstellen Sie test_debug.arr, dekomprimieren Sie die Datei „classes.jar“, um die Datei „libs“ zu ersetzen, und komprimieren Sie sie dann in „test_debug.arr“.

Plugins - Android - AndroidMainfest.xml

Plugins - Android - test_debug.arr

Unity3d-Codeteil

2 Möglichkeiten, Bilder zu lesen

1,UnityWebRequestTexture

2. Verwenden Sie den Dateistream, um Bilder zu lesen

    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;
    }

endgültige Anzeige

Vollständiger Quellcode des Projekts

Unity3d öffnet ein vollständiges Projektbeispiel für ein Handyalbum – Unity3D-Dokumentationsressourcen – CSDN-Download

Unter anderem: Unity3d liest das Handy-Fotoalbum, Unity öffnet die Handykamera, speichert Bilder usw.

expandieren

APK-Fehler beim Packen

Lösung:

 

Der Klassenpfad in build.gralde bezieht sich auf die Gradle-Plugin-Version von Android Studio.
'com.android.tools.build:gradle:3.5.2'

Und die distributionUrl in gradle-wrapper.properties ist die angegebene Gradle-Version!

DistributionUrl = https \: //services.gradle.org/distributions/gradle-5.4.1-all.zip

Gradle ist ein automatisiertes Open-Source-Build-Tool, und das Gradle-Plug-in ist ein von Google entwickeltes Plug-in für die Verwendung von Gradle in Android Studio.

Referenz-URL:

Einfache Interaktion zwischen Unity und Android, Unity öffnet das Android-Fotoalbum und ruft es auf (nach Unity2019)

Unity-Gradle-Build

Android Studio hat einen Fehler gemeldet: Error:Could not find com.android.tools.build:gradle:4.1 Remember a pit with a short memory_LittleFogCat's Blog-CSDN Blog

Unity Gradle Build – Kurzes Buch

Absicht.ACTION_PICK

Intent.ACTION_PICK - Die Zeit ist genau richtig, - Blog Garden

Unity Automatic Packaging – Android Studio – ausführliche Erklärung von build.gradle

Unity Automatic Packaging-Android Studio-build.gradle Detaillierte Erklärung- Programmierer gesucht

Ich denke du magst

Origin blog.csdn.net/m1234567q/article/details/124864866
Empfohlen
Rangfolge