Unity3d는 Android 전화 사진 앨범을 읽습니다.

개발 환경:

안드로이드 스튜디오 3.5.2

Unity3d 2020.3.25f1c1

목차

Android 스튜디오 섹션

1. 새 프로젝트 만들기 

2. 새 모듈을 만들고 테스트 이름을 지정합니다.

3. 기본적으로 생성된 중복 Moudle 앱 삭제

4. Unity3d의 classes.jar 가져오기

5. Unity3d의 UnityPlayerActivity.java 가져오기

6. MainActivity 생성

7. 자바 코드 부분

8. AndroidMainFest 구성

9. 안드로이드 빌드 aar

10. Unity3d 가져오기

Unity3d 코드 부분

최종 표시

완전한 프로젝트 소스 코드

확장하다


Android 스튜디오 섹션

1. 새 프로젝트 만들기 

새 프로젝트 만들기, 빈 활동, 패키지 com.example.unity2photo

2. 새 모듈을 만들고 테스트 이름을 지정합니다.

프로젝트, 새로 만들기 - 모듈, Android 라이브러리로 전환하고 다음을 클릭합니다.

3. 기본적으로 생성된 중복 Moudle 앱 삭제

Open Module Settings에서 APP 포인트(숫자, 예, 삭제)를 선택합니다.

4. Unity3d의 classes.jar 가져오기

Unity3d 설치 경로 아래의 해당 위치:

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

class.jar을 복사하여 libs 디렉토리 아래에 붙여넣고 classer.jar - Add As Library를 마우스 오른쪽 버튼으로 클릭합니다.

5. Unity3d의 UnityPlayerActivity.java 가져오기

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

 UnityPlayerActivity.java를 복사하여 src - main- java - com.example.test 아래에 붙여넣습니다.

6. MainActivity 생성

com.example.test, New –Activity – Empty Activity를 마우스 오른쪽 버튼으로 클릭합니다.

7. 자바 코드 부분

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 구성

<?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. 안드로이드 빌드 aar

10. Unity3d 가져오기

test_debug.arr을 패키징 및 빌드하고, classes.jar의 압축을 풀어 libs classes.jar를 대체한 다음 test_debug.arr로 압축합니다.

플러그인 - Android - AndroidMainfest.xml

플러그인 - Android - test_debug.arr

Unity3d 코드 부분

사진을 읽는 2가지 방법

1, UnityWebRequest 텍스처

2. 파일 스트림을 사용하여 사진 읽기

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

최종 표시

완전한 프로젝트 소스 코드

Unity3d는 휴대폰 앨범의 전체 프로젝트 예제를 엽니다-Unity3D 문서 리소스-CSDN 다운로드

포함: Unity3d는 휴대폰 사진 앨범을 읽고, Unity는 휴대폰 카메라를 열고, 사진을 저장합니다.

확장하다

패키징 APK ​​오류

해결책:

 

build.gralde의 클래스 경로는 Android Studio의 Gradle 플러그인 버전을 나타냅니다.
'com.android.tools.build:gradle:3.5.2'

그리고 gradle-wrapper.properties의 distributionUrl은 지정된 gradle 버전입니다!

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

Gradle은 오픈 소스 자동화 빌드 도구이며 Gradle 플러그인은 Android Studio에서 Gradle을 사용하기 위해 Google에서 개발한 플러그인입니다.

참조 URL:

Unity와 Android 간의 간단한 상호 작용, Unity는 Android 사진 앨범을 열고 호출합니다(Unity2019 이후).

Unity Gradle 빌드

Android Studio에서 오류 보고: 오류:com.android.tools.build:gradle:4.1을 찾을 수 없음 memory_LittleFogCat's Blog-CSDN Blog

Unity Gradle 빌드 - 간략한 책

의도.ACTION_PICK

Intent.ACTION_PICK - 시간이 딱 맞습니다. - Blog Garden

Unity 자동 패키징 - Android Studio - build.gradle에 대한 자세한 설명

Unity 자동 패키징-Android Studio-build.gradle 자세한 설명- 프로그래머 구함

추천

출처blog.csdn.net/m1234567q/article/details/124864866